2017-04-26 14:48:55 +00:00
// Copyright (c) 2013- PPSSPP Project.
2013-06-08 20:42:31 +00:00
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
2017-02-24 19:50:27 +00:00
# include "ppsspp_config.h"
2020-09-14 22:34:45 +00:00
# include <algorithm>
2021-04-11 01:35:23 +00:00
# include <set>
2020-09-14 22:34:45 +00:00
2020-10-04 18:48:47 +00:00
# include "Common/Net/Resolve.h"
2020-10-04 21:24:14 +00:00
# include "Common/GPU/OpenGL/GLFeatures.h"
# include "Common/Render/DrawBuffer.h"
2020-10-04 18:48:47 +00:00
# include "Common/UI/Root.h"
# include "Common/UI/View.h"
# include "Common/UI/ViewGroup.h"
# include "Common/UI/Context.h"
2020-10-04 08:30:18 +00:00
# include "Common/System/Display.h" // Only to check screen aspect ratio with pixel_yres/pixel_xres
# include "Common/System/System.h"
# include "Common/System/NativeApp.h"
# include "Common/Data/Color/RGBAUtil.h"
# include "Common/Math/curves.h"
# include "Common/Data/Text/I18n.h"
# include "Common/Data/Encoding/Utf8.h"
2013-06-08 20:42:31 +00:00
# include "UI/EmuScreen.h"
# include "UI/GameSettingsScreen.h"
# include "UI/GameInfoCache.h"
2013-11-29 15:46:47 +00:00
# include "UI/GamepadEmu.h"
2013-07-17 20:27:05 +00:00
# include "UI/MiscScreens.h"
2013-08-16 14:48:43 +00:00
# include "UI/ControlMappingScreen.h"
2013-09-07 11:38:37 +00:00
# include "UI/DevScreens.h"
2015-10-24 12:40:29 +00:00
# include "UI/DisplayLayoutScreen.h"
2016-07-03 17:24:33 +00:00
# include "UI/RemoteISOScreen.h"
2015-06-12 18:37:42 +00:00
# include "UI/SavedataScreen.h"
2013-10-09 20:15:56 +00:00
# include "UI/TouchControlLayoutScreen.h"
2013-10-20 02:40:52 +00:00
# include "UI/TouchControlVisibilityScreen.h"
2013-10-27 17:58:47 +00:00
# include "UI/TiltAnalogSettingsScreen.h"
2013-12-14 12:55:57 +00:00
# include "UI/TiltEventProcessor.h"
2015-06-28 05:34:05 +00:00
# include "UI/ComboKeyMappingScreen.h"
2018-12-16 20:48:35 +00:00
# include "UI/GPUDriverTestScreen.h"
2013-09-07 11:38:37 +00:00
2020-10-04 18:48:47 +00:00
# include "Common/File/FileUtil.h"
2017-02-14 09:33:42 +00:00
# include "Common/OSVersion.h"
2020-09-29 10:19:22 +00:00
# include "Common/TimeUtil.h"
# include "Common/StringUtils.h"
2013-06-08 20:42:31 +00:00
# include "Core/Config.h"
2018-06-17 01:42:31 +00:00
# include "Core/ConfigValues.h"
2013-09-04 19:00:00 +00:00
# include "Core/Host.h"
2020-10-03 22:25:21 +00:00
# include "Core/KeyMap.h"
2020-08-06 08:19:58 +00:00
# include "Core/Instance.h"
2013-08-14 12:44:36 +00:00
# include "Core/System.h"
2013-09-01 19:57:39 +00:00
# include "Core/Reporting.h"
2018-10-01 00:00:05 +00:00
# include "Core/TextureReplacer.h"
2018-04-21 21:17:33 +00:00
# include "Core/WebServer.h"
2020-01-09 13:57:09 +00:00
# include "Core/HLE/sceUsbCam.h"
2020-07-31 02:24:17 +00:00
# include "Core/HLE/sceUsbMic.h"
2018-03-25 12:26:44 +00:00
# include "GPU/Common/PostShader.h"
2013-10-17 14:15:04 +00:00
# include "android/jni/TestRunner.h"
# include "GPU/GPUInterface.h"
2020-08-03 21:17:22 +00:00
# include "GPU/Common/FramebufferManagerCommon.h"
2013-07-30 14:28:34 +00:00
2017-02-24 23:25:46 +00:00
# if defined(_WIN32) && !PPSSPP_PLATFORM(UWP)
2015-09-17 20:02:15 +00:00
# pragma warning(disable:4091) // workaround bug in VS2015 headers
2015-09-19 11:14:05 +00:00
# include "Windows/MainWindow.h"
2014-10-23 14:22:11 +00:00
# include <shlobj.h>
2014-10-27 18:57:40 +00:00
# include "Windows/W32Util/ShellUtil.h"
2017-02-24 19:50:27 +00:00
# endif
2014-10-23 14:22:11 +00:00
2021-05-05 23:31:38 +00:00
GameSettingsScreen : : GameSettingsScreen ( const Path & gamePath , std : : string gameID , bool editThenRestore )
2016-08-05 17:46:11 +00:00
: UIDialogScreenWithGameBackground ( gamePath ) , gameID_ ( gameID ) , enableReports_ ( false ) , editThenRestore_ ( editThenRestore ) {
2014-07-22 08:37:20 +00:00
lastVertical_ = UseVerticalLayout ( ) ;
2020-03-03 03:21:15 +00:00
prevInflightFrames_ = g_Config . iInflightFrames ;
2014-07-22 08:37:20 +00:00
}
bool GameSettingsScreen : : UseVerticalLayout ( ) const {
return dp_yres > dp_xres * 1.1f ;
}
2017-01-31 14:29:13 +00:00
// This needs before run CheckGPUFeatures()
// TODO: Remove this if fix the issue
2018-09-22 10:20:30 +00:00
bool CheckSupportShaderTessellationGLES ( ) {
2017-02-24 19:50:27 +00:00
# if PPSSPP_PLATFORM(UWP)
return true ;
# else
// TODO: Make work with non-GL backends
2018-01-19 23:05:59 +00:00
int maxVertexTextureImageUnits = gl_extensions . maxVertexTextureUnits ;
2017-01-31 14:29:13 +00:00
bool vertexTexture = maxVertexTextureImageUnits > = 3 ; // At least 3 for hardware tessellation
2017-03-26 10:00:20 +00:00
2017-03-12 15:41:28 +00:00
bool textureFloat = gl_extensions . ARB_texture_float | | gl_extensions . OES_texture_float ;
2017-12-22 02:44:47 +00:00
bool hasTexelFetch = gl_extensions . GLES3 | | ( ! gl_extensions . IsGLES & & gl_extensions . VersionGEThan ( 3 , 3 , 0 ) ) | | gl_extensions . EXT_gpu_shader4 ;
2017-01-31 14:29:13 +00:00
2018-09-22 10:20:30 +00:00
return vertexTexture & & textureFloat & & hasTexelFetch ;
2017-02-24 19:50:27 +00:00
# endif
2017-01-31 14:29:13 +00:00
}
2018-01-19 23:05:59 +00:00
bool DoesBackendSupportHWTess ( ) {
2017-12-26 23:55:24 +00:00
switch ( GetGPUBackend ( ) ) {
case GPUBackend : : OPENGL :
2018-09-22 10:20:30 +00:00
return CheckSupportShaderTessellationGLES ( ) ;
2017-12-26 23:55:24 +00:00
case GPUBackend : : VULKAN :
case GPUBackend : : DIRECT3D11 :
2017-03-04 13:46:55 +00:00
return true ;
2018-06-17 18:30:22 +00:00
default :
return false ;
2017-03-04 13:46:55 +00:00
}
}
2020-08-02 04:26:41 +00:00
static bool UsingHardwareTextureScaling ( ) {
// For now, Vulkan only.
return g_Config . bTexHardwareScaling & & GetGPUBackend ( ) = = GPUBackend : : VULKAN & & ! g_Config . bSoftwareRendering ;
}
static std : : string TextureTranslateName ( const char * value ) {
auto ps = GetI18NCategory ( " TextureShaders " ) ;
const TextureShaderInfo * info = GetTextureShaderInfo ( value ) ;
if ( info ) {
return ps - > T ( value , info ? info - > name . c_str ( ) : value ) ;
} else {
return value ;
}
}
2018-03-25 12:26:44 +00:00
static std : : string PostShaderTranslateName ( const char * value ) {
2020-01-26 18:43:18 +00:00
auto ps = GetI18NCategory ( " PostShaders " ) ;
2018-03-25 12:26:44 +00:00
const ShaderInfo * info = GetPostShaderInfo ( value ) ;
if ( info ) {
return ps - > T ( value , info ? info - > name . c_str ( ) : value ) ;
2018-03-28 09:23:41 +00:00
} else {
return value ;
2018-03-25 12:26:44 +00:00
}
}
2018-09-30 07:53:21 +00:00
static std : : string * GPUDeviceNameSetting ( ) {
if ( g_Config . iGPUBackend = = ( int ) GPUBackend : : VULKAN ) {
return & g_Config . sVulkanDevice ;
}
# ifdef _WIN32
if ( g_Config . iGPUBackend = = ( int ) GPUBackend : : DIRECT3D11 ) {
return & g_Config . sD3D11Device ;
}
# endif
return nullptr ;
}
2013-06-08 20:42:31 +00:00
void GameSettingsScreen : : CreateViews ( ) {
2018-08-31 04:17:30 +00:00
ReloadAllPostShaderInfo ( ) ;
2016-08-05 17:46:11 +00:00
if ( editThenRestore_ ) {
2019-07-18 04:28:21 +00:00
std : : shared_ptr < GameInfo > info = g_gameInfoCache - > GetInfo ( nullptr , gamePath_ , 0 ) ;
g_Config . loadGameConfig ( gameID_ , info - > GetTitle ( ) ) ;
2014-12-14 19:33:20 +00:00
}
2018-06-17 03:07:11 +00:00
iAlternateSpeedPercent1_ = g_Config . iFpsLimit1 < 0 ? - 1 : ( g_Config . iFpsLimit1 * 100 ) / 60 ;
iAlternateSpeedPercent2_ = g_Config . iFpsLimit2 < 0 ? - 1 : ( g_Config . iFpsLimit2 * 100 ) / 60 ;
2014-06-10 21:32:37 +00:00
2014-07-22 08:37:20 +00:00
bool vertical = UseVerticalLayout ( ) ;
2013-06-08 20:42:31 +00:00
// Information in the top left.
// Back button to the bottom left.
// Scrolling action menu to the right.
using namespace UI ;
2020-01-26 18:43:18 +00:00
auto di = GetI18NCategory ( " Dialog " ) ;
auto gr = GetI18NCategory ( " Graphics " ) ;
auto co = GetI18NCategory ( " Controls " ) ;
auto a = GetI18NCategory ( " Audio " ) ;
auto sa = GetI18NCategory ( " Savedata " ) ;
auto sy = GetI18NCategory ( " System " ) ;
auto n = GetI18NCategory ( " Networking " ) ;
auto ms = GetI18NCategory ( " MainSettings " ) ;
auto dev = GetI18NCategory ( " Developer " ) ;
auto ri = GetI18NCategory ( " RemoteISO " ) ;
2020-05-10 23:56:18 +00:00
auto ps = GetI18NCategory ( " PostShaders " ) ;
2013-06-08 20:42:31 +00:00
2016-08-14 21:27:36 +00:00
root_ = new AnchorLayout ( new LayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2013-07-21 16:03:54 +00:00
2014-07-22 08:37:20 +00:00
TabHolder * tabHolder ;
if ( vertical ) {
2016-08-14 21:27:36 +00:00
LinearLayout * verticalLayout = new LinearLayout ( ORIENT_VERTICAL , new LayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2014-07-22 08:37:20 +00:00
tabHolder = new TabHolder ( ORIENT_HORIZONTAL , 200 , new LinearLayoutParams ( 1.0f ) ) ;
2016-08-14 21:27:36 +00:00
verticalLayout - > Add ( tabHolder ) ;
verticalLayout - > Add ( new Choice ( di - > T ( " Back " ) , " " , false , new LinearLayoutParams ( FILL_PARENT , WRAP_CONTENT , 0.0f , Margins ( 0 ) ) ) ) - > OnClick . Handle < UIScreen > ( this , & UIScreen : : OnBack ) ;
root_ - > Add ( verticalLayout ) ;
2014-07-22 08:37:20 +00:00
} else {
tabHolder = new TabHolder ( ORIENT_VERTICAL , 200 , new AnchorLayoutParams ( 10 , 0 , 10 , 0 , false ) ) ;
root_ - > Add ( tabHolder ) ;
2015-07-04 15:01:32 +00:00
AddStandardBack ( root_ ) ;
2014-07-22 08:37:20 +00:00
}
2016-01-23 06:38:21 +00:00
tabHolder - > SetTag ( " GameSettings " ) ;
2014-03-03 11:56:01 +00:00
root_ - > SetDefaultFocusView ( tabHolder ) ;
2013-06-08 20:42:31 +00:00
2016-08-14 21:27:36 +00:00
float leftSide = 40.0f ;
if ( ! vertical ) {
leftSide + = 200.0f ;
}
settingInfo_ = new SettingInfoMessage ( ALIGN_CENTER | FLAG_WRAP_TEXT , new AnchorLayoutParams ( dp_xres - leftSide - 40.0f , WRAP_CONTENT , leftSide , dp_yres - 80.0f - 40.0f , NONE , NONE ) ) ;
settingInfo_ - > SetBottomCutoff ( dp_yres - 200.0f ) ;
root_ - > Add ( settingInfo_ ) ;
2013-06-08 20:42:31 +00:00
// TODO: These currently point to global settings, not game specific ones.
2013-07-20 14:03:52 +00:00
// Graphics
2013-06-08 20:42:31 +00:00
ViewGroup * graphicsSettingsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2016-01-23 06:52:13 +00:00
graphicsSettingsScroll - > SetTag ( " GameSettingsGraphics " ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * graphicsSettings = new LinearLayoutList ( ORIENT_VERTICAL ) ;
2013-08-19 22:49:25 +00:00
graphicsSettings - > SetSpacing ( 0 ) ;
2013-06-08 20:42:31 +00:00
graphicsSettingsScroll - > Add ( graphicsSettings ) ;
2013-08-11 15:25:50 +00:00
tabHolder - > AddTab ( ms - > T ( " Graphics " ) , graphicsSettingsScroll ) ;
2013-07-21 20:15:18 +00:00
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Rendering Mode " ) ) ) ;
2018-04-07 15:37:31 +00:00
# if !PPSSPP_PLATFORM(UWP)
2017-11-13 05:57:01 +00:00
static const char * renderingBackend [ ] = { " OpenGL " , " Direct3D 9 " , " Direct3D 11 " , " Vulkan " } ;
2017-12-26 23:55:24 +00:00
PopupMultiChoice * renderingBackendChoice = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iGPUBackend , gr - > T ( " Backend " ) , renderingBackend , ( int ) GPUBackend : : OPENGL , ARRAY_SIZE ( renderingBackend ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2014-09-14 10:59:27 +00:00
renderingBackendChoice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnRenderingBackend ) ;
2019-06-22 18:48:36 +00:00
if ( ! g_Config . IsBackendEnabled ( GPUBackend : : OPENGL ) )
renderingBackendChoice - > HideChoice ( ( int ) GPUBackend : : OPENGL ) ;
if ( ! g_Config . IsBackendEnabled ( GPUBackend : : DIRECT3D9 ) )
renderingBackendChoice - > HideChoice ( ( int ) GPUBackend : : DIRECT3D9 ) ;
if ( ! g_Config . IsBackendEnabled ( GPUBackend : : DIRECT3D11 ) )
renderingBackendChoice - > HideChoice ( ( int ) GPUBackend : : DIRECT3D11 ) ;
if ( ! g_Config . IsBackendEnabled ( GPUBackend : : VULKAN ) )
renderingBackendChoice - > HideChoice ( ( int ) GPUBackend : : VULKAN ) ;
2020-08-06 08:19:58 +00:00
if ( ! IsFirstInstance ( ) ) {
// If we're not the first instance, can't save the setting, and it requires a restart, so...
renderingBackendChoice - > SetEnabled ( false ) ;
}
2018-04-07 15:37:31 +00:00
# endif
2019-06-22 18:48:36 +00:00
2018-04-15 07:56:37 +00:00
Draw : : DrawContext * draw = screenManager ( ) - > getDrawContext ( ) ;
2018-06-06 08:24:16 +00:00
// Backends that don't allow a device choice will only expose one device.
2018-04-15 08:53:07 +00:00
if ( draw - > GetDeviceList ( ) . size ( ) > 1 ) {
2018-09-30 07:53:21 +00:00
std : : string * deviceNameSetting = GPUDeviceNameSetting ( ) ;
2018-04-15 07:56:37 +00:00
if ( deviceNameSetting ) {
PopupMultiChoiceDynamic * deviceChoice = graphicsSettings - > Add ( new PopupMultiChoiceDynamic ( deviceNameSetting , gr - > T ( " Device " ) , draw - > GetDeviceList ( ) , nullptr , screenManager ( ) ) ) ;
2018-09-30 07:53:21 +00:00
deviceChoice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnRenderingDevice ) ;
2018-04-15 07:56:37 +00:00
}
}
2017-05-30 08:38:17 +00:00
2020-03-22 01:49:36 +00:00
static const char * renderingMode [ ] = { " Non-Buffered Rendering " , " Buffered Rendering " } ;
2015-09-23 10:43:45 +00:00
PopupMultiChoice * renderingModeChoice = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iRenderingMode , gr - > T ( " Mode " ) , renderingMode , 0 , ARRAY_SIZE ( renderingMode ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2016-08-17 01:56:04 +00:00
renderingModeChoice - > OnChoice . Add ( [ = ] ( EventParams & e ) {
2016-08-14 22:26:42 +00:00
switch ( g_Config . iRenderingMode ) {
case FB_NON_BUFFERED_MODE :
2017-12-25 19:20:26 +00:00
settingInfo_ - > Show ( gr - > T ( " RenderingMode NonBuffered Tip " , " Faster, but graphics may be missing in some games " ) , e . v ) ;
2016-08-14 22:26:42 +00:00
break ;
case FB_BUFFERED_MODE :
break ;
}
return UI : : EVENT_CONTINUE ;
} ) ;
2014-06-10 21:28:13 +00:00
renderingModeChoice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnRenderingMode ) ;
2014-07-09 06:47:27 +00:00
renderingModeChoice - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2017-03-21 13:02:41 +00:00
CheckBox * blockTransfer = graphicsSettings - > Add ( new CheckBox ( & g_Config . bBlockTransferGPU , gr - > T ( " Simulate Block Transfer " , " Simulate Block Transfer " ) ) ) ;
2017-03-21 07:23:31 +00:00
blockTransfer - > OnClick . Add ( [ = ] ( EventParams & e ) {
2017-06-03 16:42:34 +00:00
if ( ! g_Config . bBlockTransferGPU )
settingInfo_ - > Show ( gr - > T ( " BlockTransfer Tip " , " Some games require this to be On for correct graphics " ) , e . v ) ;
2017-03-21 07:23:31 +00:00
return UI : : EVENT_CONTINUE ;
} ) ;
2014-07-09 06:47:27 +00:00
blockTransfer - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2017-05-24 18:53:00 +00:00
bool showSoftGPU = true ;
2017-05-24 22:31:00 +00:00
# ifdef MOBILE_DEVICE
2017-05-24 18:53:00 +00:00
// On Android, only show the software rendering setting if it's already enabled.
// Can still be turned on through INI file editing.
showSoftGPU = g_Config . bSoftwareRendering ;
# endif
if ( showSoftGPU ) {
CheckBox * softwareGPU = graphicsSettings - > Add ( new CheckBox ( & g_Config . bSoftwareRendering , gr - > T ( " Software Rendering " , " Software Rendering (slow) " ) ) ) ;
softwareGPU - > OnClick . Add ( [ = ] ( EventParams & e ) {
if ( g_Config . bSoftwareRendering )
settingInfo_ - > Show ( gr - > T ( " SoftGPU Tip " , " Currently VERY slow " ) , e . v ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
softwareGPU - > OnClick . Handle ( this , & GameSettingsScreen : : OnSoftwareRendering ) ;
2020-04-11 17:46:06 +00:00
softwareGPU - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2017-05-24 18:53:00 +00:00
}
2013-08-18 21:11:47 +00:00
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Frame Rate Control " ) ) ) ;
2014-01-25 16:41:39 +00:00
static const char * frameSkip [ ] = { " Off " , " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " , " 8 " } ;
2015-09-23 10:43:45 +00:00
graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iFrameSkip , gr - > T ( " Frame Skipping " ) , frameSkip , 0 , ARRAY_SIZE ( frameSkip ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2018-11-03 01:33:41 +00:00
static const char * frameSkipType [ ] = { " Number of Frames " , " Percent of FPS " } ;
graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iFrameSkipType , gr - > T ( " Frame Skipping Type " ) , frameSkipType , 0 , ARRAY_SIZE ( frameSkipType ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2015-07-01 21:50:16 +00:00
frameSkipAuto_ = graphicsSettings - > Add ( new CheckBox ( & g_Config . bAutoFrameSkip , gr - > T ( " Auto FrameSkip " ) ) ) ;
2014-07-22 07:55:12 +00:00
frameSkipAuto_ - > OnClick . Handle ( this , & GameSettingsScreen : : OnAutoFrameskip ) ;
2014-05-03 20:24:46 +00:00
2018-06-17 03:07:11 +00:00
PopupSliderChoice * altSpeed1 = graphicsSettings - > Add ( new PopupSliderChoice ( & iAlternateSpeedPercent1_ , 0 , 1000 , gr - > T ( " Alternative Speed " , " Alternative speed " ) , 5 , screenManager ( ) , gr - > T ( " %, 0:unlimited " ) ) ) ;
altSpeed1 - > SetFormat ( " %i%% " ) ;
altSpeed1 - > SetZeroLabel ( gr - > T ( " Unlimited " ) ) ;
altSpeed1 - > SetNegativeDisable ( gr - > T ( " Disabled " ) ) ;
PopupSliderChoice * altSpeed2 = graphicsSettings - > Add ( new PopupSliderChoice ( & iAlternateSpeedPercent2_ , 0 , 1000 , gr - > T ( " Alternative Speed 2 " , " Alternative speed 2 (in %, 0 = unlimited) " ) , 5 , screenManager ( ) , gr - > T ( " %, 0:unlimited " ) ) ) ;
altSpeed2 - > SetFormat ( " %i%% " ) ;
altSpeed2 - > SetZeroLabel ( gr - > T ( " Unlimited " ) ) ;
altSpeed2 - > SetNegativeDisable ( gr - > T ( " Disabled " ) ) ;
2013-09-30 09:57:30 +00:00
2020-05-18 09:17:45 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Postprocessing effect " ) ) ) ;
2021-04-11 01:35:23 +00:00
std : : set < std : : string > alreadyAddedShader ;
for ( int i = 0 ; i < g_Config . vPostShaderNames . size ( ) + 1 & & i < ARRAY_SIZE ( shaderNames_ ) ; + + i ) {
2020-09-15 05:45:57 +00:00
// Vector element pointer get invalidated on resize, cache name to have always a valid reference in the rendering thread
2021-04-11 01:35:23 +00:00
shaderNames_ [ i ] = i = = g_Config . vPostShaderNames . size ( ) ? " Off " : g_Config . vPostShaderNames [ i ] ;
2020-05-18 09:17:45 +00:00
postProcChoice_ = graphicsSettings - > Add ( new ChoiceWithValueDisplay ( & shaderNames_ [ i ] , StringFromFormat ( " %s #%d " , gr - > T ( " Postprocessing Shader " ) , i + 1 ) , & PostShaderTranslateName ) ) ;
postProcChoice_ - > OnClick . Add ( [ = ] ( EventParams & e ) {
auto gr = GetI18NCategory ( " Graphics " ) ;
auto procScreen = new PostProcScreen ( gr - > T ( " Postprocessing Shader " ) , i ) ;
procScreen - > OnChoice . Handle ( this , & GameSettingsScreen : : OnPostProcShaderChange ) ;
if ( e . v )
procScreen - > SetPopupOrigin ( e . v ) ;
screenManager ( ) - > push ( procScreen ) ;
return UI : : EVENT_DONE ;
} ) ;
postProcChoice_ - > SetEnabledFunc ( [ ] {
return g_Config . iRenderingMode ! = FB_NON_BUFFERED_MODE ;
} ) ;
2013-10-30 10:28:14 +00:00
2021-04-11 01:35:23 +00:00
// No need for settings on the last one.
if ( i = = g_Config . vPostShaderNames . size ( ) )
continue ;
2020-05-18 09:17:45 +00:00
auto shaderChain = GetPostShaderChain ( g_Config . vPostShaderNames [ i ] ) ;
for ( auto shaderInfo : shaderChain ) {
// Disable duplicated shader slider
2021-04-11 01:35:23 +00:00
bool duplicated = alreadyAddedShader . find ( shaderInfo - > section ) ! = alreadyAddedShader . end ( ) ;
alreadyAddedShader . insert ( shaderInfo - > section ) ;
2020-05-18 09:17:45 +00:00
for ( size_t i = 0 ; i < ARRAY_SIZE ( shaderInfo - > settings ) ; + + i ) {
auto & setting = shaderInfo - > settings [ i ] ;
if ( ! setting . name . empty ( ) ) {
auto & value = g_Config . mPostShaderSetting [ StringFromFormat ( " %sSettingValue%d " , shaderInfo - > section . c_str ( ) , i + 1 ) ] ;
if ( duplicated ) {
auto sliderName = StringFromFormat ( " %s %s " , ps - > T ( setting . name ) , ps - > T ( " (duplicated setting, previous slider will be used) " ) ) ;
PopupSliderChoiceFloat * settingValue = graphicsSettings - > Add ( new PopupSliderChoiceFloat ( & value , setting . minValue , setting . maxValue , sliderName , setting . step , screenManager ( ) ) ) ;
settingValue - > SetEnabled ( false ) ;
} else {
PopupSliderChoiceFloat * settingValue = graphicsSettings - > Add ( new PopupSliderChoiceFloat ( & value , setting . minValue , setting . maxValue , ps - > T ( setting . name ) , setting . step , screenManager ( ) ) ) ;
settingValue - > SetEnabledFunc ( [ ] {
return g_Config . iRenderingMode ! = FB_NON_BUFFERED_MODE ;
} ) ;
}
}
2020-05-16 19:29:22 +00:00
}
2020-05-16 19:25:52 +00:00
}
2020-05-15 22:52:38 +00:00
}
2020-05-16 07:27:53 +00:00
2020-05-18 09:17:45 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Screen layout " ) ) ) ;
2014-04-27 18:24:10 +00:00
# if !defined(MOBILE_DEVICE)
2019-08-14 08:09:13 +00:00
graphicsSettings - > Add ( new CheckBox ( & g_Config . bFullScreen , gr - > T ( " FullScreen " , " Full Screen " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnFullscreenChange ) ;
2017-07-30 15:33:02 +00:00
if ( System_GetPropertyInt ( SYSPROP_DISPLAY_COUNT ) > 1 ) {
CheckBox * fullscreenMulti = new CheckBox ( & g_Config . bFullScreenMulti , gr - > T ( " Use all displays " ) ) ;
fullscreenMulti - > SetEnabledPtr ( & g_Config . bFullScreen ) ;
graphicsSettings - > Add ( fullscreenMulti ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnFullscreenChange ) ;
}
2013-10-04 19:31:40 +00:00
# endif
2015-10-24 12:40:29 +00:00
// Display Layout Editor: To avoid overlapping touch controls on large tablets, meet geeky demands for integer zoom/unstretched image etc.
displayEditor_ = graphicsSettings - > Add ( new Choice ( gr - > T ( " Display layout editor " ) ) ) ;
displayEditor_ - > OnClick . Handle ( this , & GameSettingsScreen : : OnDisplayLayoutEditor ) ;
2014-07-20 10:11:50 +00:00
2020-07-05 20:46:04 +00:00
# if PPSSPP_PLATFORM(ANDROID)
// Hide insets option if no insets, or OS too old.
2020-12-16 10:57:49 +00:00
if ( System_GetPropertyInt ( SYSPROP_SYSTEMVERSION ) > = 28 & &
2020-07-05 20:46:04 +00:00
( System_GetPropertyFloat ( SYSPROP_DISPLAY_SAFE_INSET_LEFT ) ! = 0.0f | |
System_GetPropertyFloat ( SYSPROP_DISPLAY_SAFE_INSET_TOP ) ! = 0.0f | |
System_GetPropertyFloat ( SYSPROP_DISPLAY_SAFE_INSET_RIGHT ) ! = 0.0f | |
System_GetPropertyFloat ( SYSPROP_DISPLAY_SAFE_INSET_BOTTOM ) ! = 0.0f ) ) {
2020-07-06 21:43:55 +00:00
graphicsSettings - > Add ( new CheckBox ( & g_Config . bIgnoreScreenInsets , gr - > T ( " Ignore camera notch when centering " ) ) ) ;
2020-07-05 20:46:04 +00:00
}
2014-07-20 10:11:50 +00:00
// Hide Immersive Mode on pre-kitkat Android
if ( System_GetPropertyInt ( SYSPROP_SYSTEMVERSION ) > = 19 ) {
2019-08-14 08:09:13 +00:00
// Let's reuse the Fullscreen translation string from desktop.
graphicsSettings - > Add ( new CheckBox ( & g_Config . bImmersiveMode , gr - > T ( " FullScreen " , " Full Screen " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnImmersiveModeChange ) ;
2014-07-20 10:11:50 +00:00
}
2014-02-09 22:16:08 +00:00
# endif
2013-10-20 15:33:18 +00:00
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Performance " ) ) ) ;
2020-03-22 01:49:36 +00:00
static const char * internalResolutions [ ] = { " Auto (1:1) " , " 1x PSP " , " 2x PSP " , " 3x PSP " , " 4x PSP " , " 5x PSP " , " 6x PSP " , " 7x PSP " , " 8x PSP " , " 9x PSP " , " 10x PSP " } ;
2015-09-23 10:43:45 +00:00
resolutionChoice_ = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iInternalResolution , gr - > T ( " Rendering Resolution " ) , internalResolutions , 0 , ARRAY_SIZE ( internalResolutions ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2014-07-18 19:49:54 +00:00
resolutionChoice_ - > OnChoice . Handle ( this , & GameSettingsScreen : : OnResolutionChange ) ;
2020-03-22 01:49:36 +00:00
resolutionChoice_ - > SetEnabledFunc ( [ ] {
return ! g_Config . bSoftwareRendering & & g_Config . iRenderingMode ! = FB_NON_BUFFERED_MODE ;
} ) ;
2014-06-10 21:32:37 +00:00
2020-07-19 09:03:46 +00:00
# if PPSSPP_PLATFORM(ANDROID)
2018-10-06 11:43:11 +00:00
if ( System_GetPropertyInt ( SYSPROP_DEVICE_TYPE ) ! = DEVICE_TYPE_TV ) {
static const char * deviceResolutions [ ] = { " Native device resolution " , " Auto (same as Rendering) " , " 1x PSP " , " 2x PSP " , " 3x PSP " , " 4x PSP " , " 5x PSP " } ;
int max_res_temp = std : : max ( System_GetPropertyInt ( SYSPROP_DISPLAY_XRES ) , System_GetPropertyInt ( SYSPROP_DISPLAY_YRES ) ) / 480 + 2 ;
if ( max_res_temp = = 3 )
max_res_temp = 4 ; // At least allow 2x
int max_res = std : : min ( max_res_temp , ( int ) ARRAY_SIZE ( deviceResolutions ) ) ;
UI : : PopupMultiChoice * hwscale = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iAndroidHwScale , gr - > T ( " Display Resolution (HW scaler) " ) , deviceResolutions , 0 , max_res , gr - > GetName ( ) , screenManager ( ) ) ) ;
hwscale - > OnChoice . Handle ( this , & GameSettingsScreen : : OnHwScaleChange ) ; // To refresh the display mode
}
2014-07-18 19:49:54 +00:00
# endif
2020-07-20 00:02:01 +00:00
# if !(PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS))
2020-03-01 06:45:18 +00:00
CheckBox * vSync = graphicsSettings - > Add ( new CheckBox ( & g_Config . bVSync , gr - > T ( " VSync " ) ) ) ;
vSync - > OnClick . Add ( [ = ] ( EventParams & e ) {
NativeResized ( ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2013-10-27 13:09:46 +00:00
# endif
2020-07-18 18:35:39 +00:00
2020-01-29 09:16:03 +00:00
CheckBox * frameDuplication = graphicsSettings - > Add ( new CheckBox ( & g_Config . bRenderDuplicateFrames , gr - > T ( " Render duplicate frames to 60hz " ) ) ) ;
frameDuplication - > OnClick . Add ( [ = ] ( EventParams & e ) {
settingInfo_ - > Show ( gr - > T ( " RenderDuplicateFrames Tip " , " Can make framerate smoother in games that run at lower framerates " ) , e . v ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2020-08-07 08:16:43 +00:00
frameDuplication - > SetEnabledFunc ( [ ] {
return g_Config . iRenderingMode ! = FB_NON_BUFFERED_MODE & & g_Config . iFrameSkip = = 0 ;
2020-06-28 20:05:19 +00:00
} ) ;
2014-06-10 18:00:11 +00:00
2020-03-01 07:40:55 +00:00
if ( GetGPUBackend ( ) = = GPUBackend : : VULKAN | | GetGPUBackend ( ) = = GPUBackend : : OPENGL ) {
2020-03-01 16:53:46 +00:00
static const char * bufferOptions [ ] = { " No buffer " , " Up to 1 " , " Up to 2 " } ;
PopupMultiChoice * inflightChoice = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iInflightFrames , gr - > T ( " Buffer graphics commands (faster, input lag) " ) , bufferOptions , 0 , ARRAY_SIZE ( bufferOptions ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2020-03-03 03:21:15 +00:00
inflightChoice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnInflightFramesChoice ) ;
2020-03-01 07:40:55 +00:00
}
2015-07-01 21:50:16 +00:00
CheckBox * hwTransform = graphicsSettings - > Add ( new CheckBox ( & g_Config . bHardwareTransform , gr - > T ( " Hardware Transform " ) ) ) ;
2014-06-10 21:28:13 +00:00
hwTransform - > OnClick . Handle ( this , & GameSettingsScreen : : OnHardwareTransform ) ;
2014-07-09 06:47:27 +00:00
hwTransform - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2014-06-10 18:00:11 +00:00
2018-04-10 10:22:02 +00:00
CheckBox * swSkin = graphicsSettings - > Add ( new CheckBox ( & g_Config . bSoftwareSkinning , gr - > T ( " Software Skinning " ) ) ) ;
swSkin - > OnClick . Add ( [ = ] ( EventParams & e ) {
settingInfo_ - > Show ( gr - > T ( " SoftwareSkinning Tip " , " Combine skinned model draws on the CPU, faster in most games " ) , e . v ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
swSkin - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2015-07-01 21:50:16 +00:00
CheckBox * vtxCache = graphicsSettings - > Add ( new CheckBox ( & g_Config . bVertexCache , gr - > T ( " Vertex Cache " ) ) ) ;
2016-08-17 01:56:04 +00:00
vtxCache - > OnClick . Add ( [ = ] ( EventParams & e ) {
2016-08-14 22:26:42 +00:00
settingInfo_ - > Show ( gr - > T ( " VertexCache Tip " , " Faster, but may cause temporary flicker " ) , e . v ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2020-03-22 01:49:36 +00:00
vtxCache - > SetEnabledFunc ( [ ] {
return ! g_Config . bSoftwareRendering & & g_Config . bHardwareTransform ;
} ) ;
2014-06-10 18:00:11 +00:00
2015-07-01 21:50:16 +00:00
CheckBox * texBackoff = graphicsSettings - > Add ( new CheckBox ( & g_Config . bTextureBackoffCache , gr - > T ( " Lazy texture caching " , " Lazy texture caching (speedup) " ) ) ) ;
2014-07-09 06:47:27 +00:00
texBackoff - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2014-06-10 18:00:11 +00:00
2015-07-01 21:50:16 +00:00
CheckBox * texSecondary_ = graphicsSettings - > Add ( new CheckBox ( & g_Config . bTextureSecondaryCache , gr - > T ( " Retain changed textures " , " Retain changed textures (speedup, mem hog) " ) ) ) ;
2016-08-17 01:56:04 +00:00
texSecondary_ - > OnClick . Add ( [ = ] ( EventParams & e ) {
2016-08-14 22:26:42 +00:00
settingInfo_ - > Show ( gr - > T ( " RetainChangedTextures Tip " , " Makes many games slower, but some games a lot faster " ) , e . v ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2014-07-09 06:47:27 +00:00
texSecondary_ - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2013-11-29 13:20:37 +00:00
2015-07-01 21:50:16 +00:00
CheckBox * framebufferSlowEffects = graphicsSettings - > Add ( new CheckBox ( & g_Config . bDisableSlowFramebufEffects , gr - > T ( " Disable slower effects (speedup) " ) ) ) ;
2014-07-09 06:57:43 +00:00
framebufferSlowEffects - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2016-12-15 09:33:54 +00:00
// Seems solid, so we hide the setting.
/*CheckBox *vtxJit = graphicsSettings->Add(new CheckBox(&g_Config.bVertexDecoderJit, gr->T("Vertex Decoder JIT")));
2013-11-29 13:20:37 +00:00
2016-12-14 16:20:37 +00:00
if ( PSP_IsInited ( ) ) {
vtxJit - > SetEnabled ( false ) ;
2016-12-15 09:33:54 +00:00
} */
2013-11-09 17:16:26 +00:00
2020-03-22 01:49:36 +00:00
static const char * quality [ ] = { " Low " , " Medium " , " High " } ;
2015-09-23 10:43:45 +00:00
PopupMultiChoice * beziersChoice = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iSplineBezierQuality , gr - > T ( " LowCurves " , " Spline/Bezier curves quality " ) , quality , 0 , ARRAY_SIZE ( quality ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2016-12-14 16:20:37 +00:00
beziersChoice - > OnChoice . Add ( [ = ] ( EventParams & e ) {
2017-01-17 11:55:48 +00:00
if ( g_Config . iSplineBezierQuality ! = 0 ) {
2017-03-21 14:18:54 +00:00
settingInfo_ - > Show ( gr - > T ( " LowCurves Tip " , " Only used by some games, controls smoothness of curves " ) , e . v ) ;
2016-12-14 16:20:37 +00:00
}
return UI : : EVENT_CONTINUE ;
} ) ;
2016-08-27 18:38:05 +00:00
2018-03-24 16:37:17 +00:00
CheckBox * tessellationHW = graphicsSettings - > Add ( new CheckBox ( & g_Config . bHardwareTessellation , gr - > T ( " Hardware Tessellation " ) ) ) ;
2017-01-09 10:18:27 +00:00
tessellationHW - > OnClick . Add ( [ = ] ( EventParams & e ) {
2018-09-22 10:20:30 +00:00
settingInfo_ - > Show ( gr - > T ( " HardwareTessellation Tip " , " Uses hardware to make curves " ) , e . v ) ;
2017-01-09 10:18:27 +00:00
return UI : : EVENT_CONTINUE ;
} ) ;
2018-01-19 23:05:59 +00:00
tessHWEnable_ = DoesBackendSupportHWTess ( ) & & ! g_Config . bSoftwareRendering & & g_Config . bHardwareTransform ;
2017-01-31 14:29:13 +00:00
tessellationHW - > SetEnabledPtr ( & tessHWEnable_ ) ;
2017-01-06 15:14:58 +00:00
2013-09-28 06:21:59 +00:00
// In case we're going to add few other antialiasing option like MSAA in the future.
2015-07-01 21:50:16 +00:00
// graphicsSettings->Add(new CheckBox(&g_Config.bFXAA, gr->T("FXAA")));
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Texture Scaling " ) ) ) ;
2014-02-08 18:29:22 +00:00
# ifndef MOBILE_DEVICE
2019-06-10 20:57:15 +00:00
static const char * texScaleLevels [ ] = { " Auto " , " Off " , " 2x " , " 3x " , " 4x " , " 5x " } ;
2013-07-26 12:25:11 +00:00
# else
2019-06-10 20:57:15 +00:00
static const char * texScaleLevels [ ] = { " Auto " , " Off " , " 2x " , " 3x " } ;
2013-07-26 12:25:11 +00:00
# endif
2014-01-20 05:14:21 +00:00
2019-06-10 20:57:15 +00:00
PopupMultiChoice * texScalingChoice = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iTexScalingLevel , gr - > T ( " Upscale Level " ) , texScaleLevels , 0 , ARRAY_SIZE ( texScaleLevels ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2016-03-26 21:34:24 +00:00
// TODO: Better check? When it won't work, it scales down anyway.
if ( ! gl_extensions . OES_texture_npot & & GetGPUBackend ( ) = = GPUBackend : : OPENGL ) {
texScalingChoice - > HideChoice ( 3 ) ; // 3x
texScalingChoice - > HideChoice ( 5 ) ; // 5x
}
2016-08-17 01:56:04 +00:00
texScalingChoice - > OnChoice . Add ( [ = ] ( EventParams & e ) {
2020-08-02 04:26:41 +00:00
if ( g_Config . iTexScalingLevel ! = 1 & & ! UsingHardwareTextureScaling ( ) ) {
2016-08-14 22:26:42 +00:00
settingInfo_ - > Show ( gr - > T ( " UpscaleLevel Tip " , " CPU heavy - some scaling may be delayed to avoid stutter " ) , e . v ) ;
}
return UI : : EVENT_CONTINUE ;
} ) ;
2014-07-09 06:47:27 +00:00
texScalingChoice - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2014-06-10 18:00:11 +00:00
2013-07-17 23:04:11 +00:00
static const char * texScaleAlgos [ ] = { " xBRZ " , " Hybrid " , " Bicubic " , " Hybrid + Bicubic " , } ;
2015-09-23 10:43:45 +00:00
PopupMultiChoice * texScalingType = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iTexScalingType , gr - > T ( " Upscale Type " ) , texScaleAlgos , 0 , ARRAY_SIZE ( texScaleAlgos ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2020-08-02 04:26:41 +00:00
texScalingType - > SetEnabledFunc ( [ ] ( ) {
return ! g_Config . bSoftwareRendering & & ! UsingHardwareTextureScaling ( ) ;
} ) ;
2014-06-10 21:28:13 +00:00
2015-07-01 21:50:16 +00:00
CheckBox * deposterize = graphicsSettings - > Add ( new CheckBox ( & g_Config . bTexDeposterize , gr - > T ( " Deposterize " ) ) ) ;
2016-12-14 16:20:37 +00:00
deposterize - > OnClick . Add ( [ = ] ( EventParams & e ) {
2017-03-21 07:23:31 +00:00
if ( g_Config . bTexDeposterize = = true ) {
2017-03-21 14:18:54 +00:00
settingInfo_ - > Show ( gr - > T ( " Deposterize Tip " , " Fixes visual banding glitches in upscaled textures " ) , e . v ) ;
2017-03-21 07:23:31 +00:00
}
2016-12-14 16:20:37 +00:00
return UI : : EVENT_CONTINUE ;
} ) ;
2020-08-02 04:26:41 +00:00
deposterize - > SetEnabledFunc ( [ ] ( ) {
return ! g_Config . bSoftwareRendering & & ! UsingHardwareTextureScaling ( ) ;
} ) ;
ChoiceWithValueDisplay * textureShaderChoice = graphicsSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sTextureShaderName , gr - > T ( " Texture Shader " ) , & TextureTranslateName ) ) ;
textureShaderChoice - > OnClick . Handle ( this , & GameSettingsScreen : : OnTextureShader ) ;
2020-08-02 05:32:55 +00:00
textureShaderChoice - > SetEnabledFunc ( [ ] ( ) {
return GetGPUBackend ( ) = = GPUBackend : : VULKAN & & ! g_Config . bSoftwareRendering ;
} ) ;
2014-06-10 21:28:13 +00:00
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Texture Filtering " ) ) ) ;
2013-08-16 10:52:16 +00:00
static const char * anisoLevels [ ] = { " Off " , " 2x " , " 4x " , " 8x " , " 16x " } ;
2015-09-23 10:43:45 +00:00
PopupMultiChoice * anisoFiltering = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iAnisotropyLevel , gr - > T ( " Anisotropic Filtering " ) , anisoLevels , 0 , ARRAY_SIZE ( anisoLevels ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2014-07-09 06:47:27 +00:00
anisoFiltering - > SetDisabledPtr ( & g_Config . bSoftwareRendering ) ;
2014-06-10 21:28:13 +00:00
2020-09-13 13:41:51 +00:00
static const char * texFilters [ ] = { " Auto " , " Nearest " , " Linear " } ;
2017-05-09 04:03:10 +00:00
graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iTexFiltering , gr - > T ( " Texture Filter " ) , texFilters , 1 , ARRAY_SIZE ( texFilters ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2013-07-17 20:27:05 +00:00
2014-08-08 18:51:15 +00:00
static const char * bufFilters [ ] = { " Linear " , " Nearest " , } ;
2016-01-18 07:47:42 +00:00
graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iBufFilter , gr - > T ( " Screen Scaling Filter " ) , bufFilters , 1 , ARRAY_SIZE ( bufFilters ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2014-08-08 18:51:15 +00:00
2019-10-25 08:56:01 +00:00
# if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(IOS)
2020-08-30 15:50:42 +00:00
bool showCardboardSettings = true ;
# else
// If you enabled it through the ini, you can see this. Useful for testing.
bool showCardboardSettings = g_Config . bEnableCardboardVR ;
# endif
2020-08-30 20:43:13 +00:00
if ( showCardboardSettings ) {
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Cardboard VR Settings " , " Cardboard VR Settings " ) ) ) ;
graphicsSettings - > Add ( new CheckBox ( & g_Config . bEnableCardboardVR , gr - > T ( " Enable Cardboard VR " , " Enable Cardboard VR " ) ) ) ;
PopupSliderChoice * cardboardScreenSize = graphicsSettings - > Add ( new PopupSliderChoice ( & g_Config . iCardboardScreenSize , 30 , 100 , gr - > T ( " Cardboard Screen Size " , " Screen Size (in % of the viewport) " ) , 1 , screenManager ( ) , gr - > T ( " % of viewport " ) ) ) ;
cardboardScreenSize - > SetEnabledPtr ( & g_Config . bEnableCardboardVR ) ;
PopupSliderChoice * cardboardXShift = graphicsSettings - > Add ( new PopupSliderChoice ( & g_Config . iCardboardXShift , - 100 , 100 , gr - > T ( " Cardboard Screen X Shift " , " X Shift (in % of the void) " ) , 1 , screenManager ( ) , gr - > T ( " % of the void " ) ) ) ;
cardboardXShift - > SetEnabledPtr ( & g_Config . bEnableCardboardVR ) ;
PopupSliderChoice * cardboardYShift = graphicsSettings - > Add ( new PopupSliderChoice ( & g_Config . iCardboardYShift , - 100 , 100 , gr - > T ( " Cardboard Screen Y Shift " , " Y Shift (in % of the void) " ) , 1 , screenManager ( ) , gr - > T ( " % of the void " ) ) ) ;
cardboardYShift - > SetEnabledPtr ( & g_Config . bEnableCardboardVR ) ;
}
2019-10-25 08:34:08 +00:00
2020-03-09 02:56:02 +00:00
std : : vector < std : : string > cameraList = Camera : : getDeviceList ( ) ;
if ( cameraList . size ( ) > = 1 ) {
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Camera " ) ) ) ;
PopupMultiChoiceDynamic * cameraChoice = graphicsSettings - > Add ( new PopupMultiChoiceDynamic ( & g_Config . sCameraDevice , gr - > T ( " Camera Device " ) , cameraList , nullptr , screenManager ( ) ) ) ;
cameraChoice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnCameraDeviceChange ) ;
}
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Hack Settings " , " Hack Settings (these WILL cause glitches) " ) ) ) ;
2016-12-14 16:20:37 +00:00
2015-01-23 01:08:20 +00:00
static const char * bloomHackOptions [ ] = { " Off " , " Safe " , " Balanced " , " Aggressive " } ;
2015-09-23 10:43:45 +00:00
PopupMultiChoice * bloomHack = graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iBloomHack , gr - > T ( " Lower resolution for effects (reduces artifacts) " ) , bloomHackOptions , 0 , ARRAY_SIZE ( bloomHackOptions ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2020-03-22 01:49:36 +00:00
bloomHack - > SetEnabledFunc ( [ ] {
return ! g_Config . bSoftwareRendering & & g_Config . iInternalResolution ! = 1 ;
} ) ;
2015-01-23 01:08:20 +00:00
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Overlay Information " ) ) ) ;
2019-06-10 20:57:15 +00:00
static const char * fpsChoices [ ] = { " None " , " Speed " , " FPS " , " Both " } ;
2015-09-23 10:43:45 +00:00
graphicsSettings - > Add ( new PopupMultiChoice ( & g_Config . iShowFPSCounter , gr - > T ( " Show FPS Counter " ) , fpsChoices , 0 , ARRAY_SIZE ( fpsChoices ) , gr - > GetName ( ) , screenManager ( ) ) ) ;
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new CheckBox ( & g_Config . bShowDebugStats , gr - > T ( " Show Debug Statistics " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnJitAffectingSetting ) ;
2013-10-20 15:33:18 +00:00
2013-09-30 17:13:47 +00:00
// Developer tools are not accessible ingame, so it goes here.
2015-07-01 21:50:16 +00:00
graphicsSettings - > Add ( new ItemHeader ( gr - > T ( " Debugging " ) ) ) ;
Choice * dump = graphicsSettings - > Add ( new Choice ( gr - > T ( " Dump next frame to log " ) ) ) ;
2013-08-18 21:11:47 +00:00
dump - > OnClick . Handle ( this , & GameSettingsScreen : : OnDumpNextFrameToLog ) ;
if ( ! PSP_IsInited ( ) )
dump - > SetEnabled ( false ) ;
2013-08-18 17:51:40 +00:00
2013-07-20 14:03:52 +00:00
// Audio
2013-06-08 20:42:31 +00:00
ViewGroup * audioSettingsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2016-01-23 06:52:13 +00:00
audioSettingsScroll - > SetTag ( " GameSettingsAudio " ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * audioSettings = new LinearLayoutList ( ORIENT_VERTICAL ) ;
2013-08-19 22:49:25 +00:00
audioSettings - > SetSpacing ( 0 ) ;
2013-06-08 20:42:31 +00:00
audioSettingsScroll - > Add ( audioSettings ) ;
2013-08-11 15:25:50 +00:00
tabHolder - > AddTab ( ms - > T ( " Audio " ) , audioSettingsScroll ) ;
2013-08-09 10:57:03 +00:00
2013-08-20 10:28:17 +00:00
audioSettings - > Add ( new ItemHeader ( ms - > T ( " Audio " ) ) ) ;
2013-08-09 10:57:03 +00:00
2013-08-16 17:34:44 +00:00
audioSettings - > Add ( new CheckBox ( & g_Config . bEnableSound , a - > T ( " Enable Sound " ) ) ) ;
2015-01-24 12:50:27 +00:00
2016-01-18 06:47:29 +00:00
PopupSliderChoice * volume = audioSettings - > Add ( new PopupSliderChoice ( & g_Config . iGlobalVolume , VOLUME_OFF , VOLUME_MAX , a - > T ( " Global volume " ) , screenManager ( ) ) ) ;
volume - > SetEnabledPtr ( & g_Config . bEnableSound ) ;
2019-06-23 20:34:08 +00:00
volume - > SetZeroLabel ( a - > T ( " Mute " ) ) ;
PopupSliderChoice * altVolume = audioSettings - > Add ( new PopupSliderChoice ( & g_Config . iAltSpeedVolume , VOLUME_OFF , VOLUME_MAX , a - > T ( " Alternate speed volume " ) , screenManager ( ) ) ) ;
altVolume - > SetEnabledPtr ( & g_Config . bEnableSound ) ;
altVolume - > SetZeroLabel ( a - > T ( " Mute " ) ) ;
altVolume - > SetNegativeDisable ( a - > T ( " Use global volume " ) ) ;
2016-01-18 06:47:29 +00:00
2020-12-19 11:57:05 +00:00
// Hide the backend selector in UWP builds (we only support XAudio2 there).
# if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP)
2015-02-01 10:56:44 +00:00
if ( IsVistaOrHigher ( ) ) {
2015-02-01 17:04:06 +00:00
static const char * backend [ ] = { " Auto " , " DSound (compatible) " , " WASAPI (fast) " } ;
2015-09-23 10:43:45 +00:00
PopupMultiChoice * audioBackend = audioSettings - > Add ( new PopupMultiChoice ( & g_Config . iAudioBackend , a - > T ( " Audio backend " , " Audio backend (restart req.) " ) , backend , 0 , ARRAY_SIZE ( backend ) , a - > GetName ( ) , screenManager ( ) ) ) ;
2015-02-01 10:56:44 +00:00
audioBackend - > SetEnabledPtr ( & g_Config . bEnableSound ) ;
}
2015-01-24 12:50:27 +00:00
# endif
2020-07-31 02:24:17 +00:00
std : : vector < std : : string > micList = Microphone : : getDeviceList ( ) ;
2020-12-19 11:57:05 +00:00
if ( ! micList . empty ( ) ) {
2020-11-22 17:06:26 +00:00
audioSettings - > Add ( new ItemHeader ( a - > T ( " Microphone " ) ) ) ;
PopupMultiChoiceDynamic * MicChoice = audioSettings - > Add ( new PopupMultiChoiceDynamic ( & g_Config . sMicDevice , a - > T ( " Microphone Device " ) , micList , nullptr , screenManager ( ) ) ) ;
2020-07-31 02:24:17 +00:00
MicChoice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnMicDeviceChange ) ;
}
2019-09-15 20:23:48 +00:00
# if defined(SDL)
std : : vector < std : : string > audioDeviceList ;
SplitString ( System_GetProperty ( SYSPROP_AUDIO_DEVICE_LIST ) , ' \0 ' , audioDeviceList ) ;
2019-09-15 20:42:56 +00:00
audioDeviceList . insert ( audioDeviceList . begin ( ) , a - > T ( " Auto " ) ) ;
2019-09-15 20:23:48 +00:00
PopupMultiChoiceDynamic * audioDevice = audioSettings - > Add ( new PopupMultiChoiceDynamic ( & g_Config . sAudioDevice , a - > T ( " Device " ) , audioDeviceList , nullptr , screenManager ( ) ) ) ;
audioDevice - > OnChoice . Handle ( this , & GameSettingsScreen : : OnAudioDevice ) ;
2019-09-15 20:42:56 +00:00
audioSettings - > Add ( new CheckBox ( & g_Config . bAutoAudioDevice , a - > T ( " Switch on new audio device " ) ) ) ;
2019-09-15 20:23:48 +00:00
# endif
2016-12-01 20:40:44 +00:00
# if defined(__ANDROID__)
CheckBox * extraAudio = audioSettings - > Add ( new CheckBox ( & g_Config . bExtraAudioBuffering , a - > T ( " AudioBufferingForBluetooth " , " Bluetooth-friendly buffer (slower) " ) ) ) ;
2016-12-01 20:35:32 +00:00
extraAudio - > SetEnabledPtr ( & g_Config . bEnableSound ) ;
2016-12-01 20:40:44 +00:00
# endif
2013-08-16 17:34:44 +00:00
2013-07-20 14:03:52 +00:00
// Control
2013-06-09 10:41:12 +00:00
ViewGroup * controlsSettingsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2016-01-23 06:52:13 +00:00
controlsSettingsScroll - > SetTag ( " GameSettingsControls " ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * controlsSettings = new LinearLayoutList ( ORIENT_VERTICAL ) ;
2013-08-19 22:49:25 +00:00
controlsSettings - > SetSpacing ( 0 ) ;
2013-06-09 10:41:12 +00:00
controlsSettingsScroll - > Add ( controlsSettings ) ;
2013-08-11 15:25:50 +00:00
tabHolder - > AddTab ( ms - > T ( " Controls " ) , controlsSettingsScroll ) ;
2013-08-20 10:28:17 +00:00
controlsSettings - > Add ( new ItemHeader ( ms - > T ( " Controls " ) ) ) ;
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new Choice ( co - > T ( " Control Mapping " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnControlMapping ) ;
2013-10-09 20:15:56 +00:00
2015-02-28 22:02:03 +00:00
# if defined(USING_WIN_UI)
2021-02-27 22:40:02 +00:00
controlsSettings - > Add ( new CheckBox ( & g_Config . bSystemControls , co - > T ( " Enable standard shortcut keys " ) ) ) ;
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new CheckBox ( & g_Config . bGamepadOnlyFocused , co - > T ( " Ignore gamepads when not focused " ) ) ) ;
2015-02-28 22:02:03 +00:00
# endif
2014-02-08 18:29:22 +00:00
# if defined(MOBILE_DEVICE)
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new CheckBox ( & g_Config . bHapticFeedback , co - > T ( " HapticFeedback " , " Haptic Feedback (vibration) " ) ) ) ;
2020-03-22 01:49:36 +00:00
static const char * tiltTypes [ ] = { " None (Disabled) " , " Analog Stick " , " D-PAD " , " PSP Action Buttons " , " L/R Trigger Buttons " } ;
2015-09-23 11:34:23 +00:00
controlsSettings - > Add ( new PopupMultiChoice ( & g_Config . iTiltInputType , co - > T ( " Tilt Input Type " ) , tiltTypes , 0 , ARRAY_SIZE ( tiltTypes ) , co - > GetName ( ) , screenManager ( ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnTiltTypeChange ) ;
2013-11-11 11:52:04 +00:00
2015-07-01 20:31:04 +00:00
Choice * customizeTilt = controlsSettings - > Add ( new Choice ( co - > T ( " Customize tilt " ) ) ) ;
2015-04-03 09:50:03 +00:00
customizeTilt - > OnClick . Handle ( this , & GameSettingsScreen : : OnTiltCustomize ) ;
2020-03-22 01:49:36 +00:00
customizeTilt - > SetEnabledFunc ( [ ] {
return g_Config . iTiltInputType ! = 0 ;
} ) ;
2013-09-29 19:47:15 +00:00
# endif
2015-04-03 09:50:03 +00:00
// TVs don't have touch control, at least not yet.
if ( System_GetPropertyInt ( SYSPROP_DEVICE_TYPE ) ! = DEVICE_TYPE_TV ) {
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new ItemHeader ( co - > T ( " OnScreen " , " On-Screen Touch Controls " ) ) ) ;
controlsSettings - > Add ( new CheckBox ( & g_Config . bShowTouchControls , co - > T ( " OnScreen " , " On-Screen Touch Controls " ) ) ) ;
layoutEditorChoice_ = controlsSettings - > Add ( new Choice ( co - > T ( " Custom layout... " ) ) ) ;
2015-04-03 09:50:03 +00:00
layoutEditorChoice_ - > OnClick . Handle ( this , & GameSettingsScreen : : OnTouchControlLayout ) ;
layoutEditorChoice_ - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
// Re-centers itself to the touch location on touch-down.
2015-07-01 20:31:04 +00:00
CheckBox * floatingAnalog = controlsSettings - > Add ( new CheckBox ( & g_Config . bAutoCenterTouchAnalog , co - > T ( " Auto-centering analog stick " ) ) ) ;
2015-04-03 09:50:03 +00:00
floatingAnalog - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
2015-06-28 05:34:05 +00:00
// Combo key setup
Choice * comboKey = controlsSettings - > Add ( new Choice ( co - > T ( " Combo Key Setup " ) ) ) ;
2017-04-18 03:33:22 +00:00
comboKey - > OnClick . Handle ( this , & GameSettingsScreen : : OnComboKey ) ;
2015-06-28 05:34:05 +00:00
comboKey - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
2016-10-12 10:32:20 +00:00
// On non iOS systems, offer to let the user see this button.
2015-04-03 09:50:03 +00:00
// Some Windows touch devices don't have a back button or other button to call up the menu.
2017-04-30 00:35:12 +00:00
if ( System_GetPropertyBool ( SYSPROP_HAS_BACK_BUTTON ) ) {
2017-04-13 05:02:50 +00:00
CheckBox * enablePauseBtn = controlsSettings - > Add ( new CheckBox ( & g_Config . bShowTouchPause , co - > T ( " Show Touch Pause Menu Button " ) ) ) ;
// Don't allow the user to disable it once in-game, so they can't lock themselves out of the menu.
if ( ! PSP_IsInited ( ) ) {
enablePauseBtn - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
} else {
enablePauseBtn - > SetEnabled ( false ) ;
}
2015-04-03 09:50:03 +00:00
}
2014-02-25 06:39:10 +00:00
2015-07-01 20:31:04 +00:00
CheckBox * disableDiags = controlsSettings - > Add ( new CheckBox ( & g_Config . bDisableDpadDiagonals , co - > T ( " Disable D-Pad diagonals (4-way touch) " ) ) ) ;
2015-04-03 09:50:03 +00:00
disableDiags - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
2015-12-20 20:58:24 +00:00
PopupSliderChoice * opacity = controlsSettings - > Add ( new PopupSliderChoice ( & g_Config . iTouchButtonOpacity , 0 , 100 , co - > T ( " Button Opacity " ) , screenManager ( ) , " % " ) ) ;
2015-04-03 09:50:03 +00:00
opacity - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
2015-12-20 20:58:24 +00:00
opacity - > SetFormat ( " %i%% " ) ;
2015-12-28 00:34:51 +00:00
PopupSliderChoice * autoHide = controlsSettings - > Add ( new PopupSliderChoice ( & g_Config . iTouchButtonHideSeconds , 0 , 300 , co - > T ( " Auto-hide buttons after seconds " ) , screenManager ( ) , co - > T ( " seconds, 0 : off " ) ) ) ;
2015-12-20 20:40:47 +00:00
autoHide - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
2015-12-20 20:58:24 +00:00
autoHide - > SetFormat ( " %is " ) ;
autoHide - > SetZeroLabel ( co - > T ( " Off " ) ) ;
2018-09-30 23:48:02 +00:00
static const char * touchControlStyles [ ] = { " Classic " , " Thin borders " , " Glowing borders " } ;
2015-09-23 10:43:45 +00:00
View * style = controlsSettings - > Add ( new PopupMultiChoice ( & g_Config . iTouchButtonStyle , co - > T ( " Button style " ) , touchControlStyles , 0 , ARRAY_SIZE ( touchControlStyles ) , co - > GetName ( ) , screenManager ( ) ) ) ;
2015-04-03 09:50:03 +00:00
style - > SetEnabledPtr ( & g_Config . bShowTouchControls ) ;
}
2013-10-10 14:44:12 +00:00
2015-03-01 15:38:22 +00:00
# ifdef _WIN32
2015-01-17 16:47:19 +00:00
static const char * inverseDeadzoneModes [ ] = { " Off " , " X " , " Y " , " X + Y " } ;
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new ItemHeader ( co - > T ( " DInput Analog Settings " , " DInput Analog Settings " ) ) ) ;
2015-11-06 07:25:40 +00:00
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fDInputAnalogDeadzone , 0.0f , 1.0f , co - > T ( " Deadzone Radius " ) , 0.01f , screenManager ( ) , " / 1.0 " ) ) ;
2015-09-23 10:43:45 +00:00
controlsSettings - > Add ( new PopupMultiChoice ( & g_Config . iDInputAnalogInverseMode , co - > T ( " Analog Mapper Mode " ) , inverseDeadzoneModes , 0 , ARRAY_SIZE ( inverseDeadzoneModes ) , co - > GetName ( ) , screenManager ( ) ) ) ;
2015-11-06 07:25:40 +00:00
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fDInputAnalogInverseDeadzone , 0.0f , 1.0f , co - > T ( " Analog Mapper Low End " , " Analog Mapper Low End (Inverse Deadzone) " ) , 0.01f , screenManager ( ) , " / 1.0 " ) ) ;
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fDInputAnalogSensitivity , 0.0f , 10.0f , co - > T ( " Analog Mapper High End " , " Analog Mapper High End (Axis Sensitivity) " ) , 0.01f , screenManager ( ) , " x " ) ) ;
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new ItemHeader ( co - > T ( " XInput Analog Settings " , " XInput Analog Settings " ) ) ) ;
2015-11-06 07:25:40 +00:00
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fXInputAnalogDeadzone , 0.0f , 1.0f , co - > T ( " Deadzone Radius " ) , 0.01f , screenManager ( ) , " / 1.0 " ) ) ;
2015-09-23 10:43:45 +00:00
controlsSettings - > Add ( new PopupMultiChoice ( & g_Config . iXInputAnalogInverseMode , co - > T ( " Analog Mapper Mode " ) , inverseDeadzoneModes , 0 , ARRAY_SIZE ( inverseDeadzoneModes ) , co - > GetName ( ) , screenManager ( ) ) ) ;
2015-11-06 07:25:40 +00:00
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fXInputAnalogInverseDeadzone , 0.0f , 1.0f , co - > T ( " Analog Mapper Low End " , " Analog Mapper Low End (Inverse Deadzone) " ) , 0.01f , screenManager ( ) , " / 1.0 " ) ) ;
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fXInputAnalogSensitivity , 0.0f , 10.0f , co - > T ( " Analog Mapper High End " , " Analog Mapper High End (Axis Sensitivity) " ) , 0.01f , screenManager ( ) , " x " ) ) ;
2017-05-10 12:26:35 +00:00
# else
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fXInputAnalogSensitivity , 0.0f , 10.0f , co - > T ( " Analog Axis Sensitivity " , " Analog Axis Sensitivity " ) , 0.01f , screenManager ( ) , " x " ) ) ;
2015-03-01 15:38:22 +00:00
# endif
2020-03-23 08:24:36 +00:00
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fAnalogAutoRotSpeed , 0.0f , 25.0f , co - > T ( " Analog auto-rotation speed " ) , 1.0f , screenManager ( ) ) ) ;
2015-01-17 16:47:19 +00:00
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new ItemHeader ( co - > T ( " Keyboard " , " Keyboard Control Settings " ) ) ) ;
2014-08-16 19:05:37 +00:00
# if defined(USING_WIN_UI)
2015-07-01 20:31:04 +00:00
controlsSettings - > Add ( new CheckBox ( & g_Config . bIgnoreWindowsKey , co - > T ( " Ignore Windows Key " ) ) ) ;
2014-08-16 19:05:37 +00:00
# endif // #if defined(USING_WIN_UI)
2016-08-14 22:26:42 +00:00
auto analogLimiter = new PopupSliderChoiceFloat ( & g_Config . fAnalogLimiterDeadzone , 0.0f , 1.0f , co - > T ( " Analog Limiter " ) , 0.10f , screenManager ( ) , " / 1.0 " ) ;
controlsSettings - > Add ( analogLimiter ) ;
2016-08-17 01:56:04 +00:00
analogLimiter - > OnChange . Add ( [ = ] ( EventParams & e ) {
settingInfo_ - > Show ( co - > T ( " AnalogLimiter Tip " , " When the analog limiter button is pressed " ) , e . v ) ;
2016-08-14 22:26:42 +00:00
return UI : : EVENT_CONTINUE ;
} ) ;
2020-02-04 04:11:07 +00:00
# if defined(USING_WIN_UI) || defined(SDL)
2017-04-29 12:00:39 +00:00
controlsSettings - > Add ( new ItemHeader ( co - > T ( " Mouse " , " Mouse settings " ) ) ) ;
2017-04-27 10:06:39 +00:00
CheckBox * mouseControl = controlsSettings - > Add ( new CheckBox ( & g_Config . bMouseControl , co - > T ( " Use Mouse Control " ) ) ) ;
mouseControl - > OnClick . Add ( [ = ] ( EventParams & e ) {
if ( g_Config . bMouseControl )
settingInfo_ - > Show ( co - > T ( " MouseControl Tip " , " You can now map mouse in control mapping screen by pressing the 'M' icon. " ) , e . v ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2017-06-03 15:48:35 +00:00
controlsSettings - > Add ( new CheckBox ( & g_Config . bMouseConfine , co - > T ( " Confine Mouse " , " Trap mouse within window/display area " ) ) ) - > SetEnabledPtr ( & g_Config . bMouseControl ) ;
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fMouseSensitivity , 0.01f , 1.0f , co - > T ( " Mouse sensitivity " ) , 0.01f , screenManager ( ) , " x " ) ) - > SetEnabledPtr ( & g_Config . bMouseControl ) ;
controlsSettings - > Add ( new PopupSliderChoiceFloat ( & g_Config . fMouseSmoothing , 0.0f , 0.95f , co - > T ( " Mouse smoothing " ) , 0.05f , screenManager ( ) , " x " ) ) - > SetEnabledPtr ( & g_Config . bMouseControl ) ;
2017-04-26 14:48:55 +00:00
# endif
2014-01-07 20:32:58 +00:00
2015-01-04 10:59:43 +00:00
ViewGroup * networkingSettingsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2016-01-23 06:52:13 +00:00
networkingSettingsScroll - > SetTag ( " GameSettingsNetworking " ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * networkingSettings = new LinearLayoutList ( ORIENT_VERTICAL ) ;
2015-01-04 10:59:43 +00:00
networkingSettings - > SetSpacing ( 0 ) ;
networkingSettingsScroll - > Add ( networkingSettings ) ;
2015-01-05 00:32:53 +00:00
tabHolder - > AddTab ( ms - > T ( " Networking " ) , networkingSettingsScroll ) ;
2021-01-09 14:01:35 +00:00
networkingSettings - > Add ( new ItemHeader ( ms - > T ( " Networking " ) ) ) ;
2015-01-04 10:59:43 +00:00
2015-01-29 21:47:46 +00:00
networkingSettings - > Add ( new Choice ( n - > T ( " Adhoc Multiplayer forum " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnAdhocGuides ) ;
2015-01-29 21:15:42 +00:00
2015-01-04 10:59:43 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bEnableWlan , n - > T ( " Enable networking " , " Enable networking/wlan (beta) " ) ) ) ;
2020-08-01 16:36:17 +00:00
networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sMACAddress , n - > T ( " Change Mac Address " ) , ( const char * ) nullptr ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeMacAddress ) ;
2020-03-01 20:59:13 +00:00
static const char * wlanChannels [ ] = { " Auto " , " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " , " 8 " , " 9 " , " 10 " , " 11 " } ;
2020-08-01 16:36:17 +00:00
auto wlanChannelChoice = networkingSettings - > Add ( new PopupMultiChoice ( & g_Config . iWlanAdhocChannel , n - > T ( " WLAN Channel " ) , wlanChannels , 0 , ARRAY_SIZE ( wlanChannels ) , n - > GetName ( ) , screenManager ( ) ) ) ;
2020-03-01 20:59:13 +00:00
for ( int i = 0 ; i < 4 ; i + + ) {
2020-08-01 16:36:17 +00:00
wlanChannelChoice - > HideChoice ( i + 2 ) ;
wlanChannelChoice - > HideChoice ( i + 7 ) ;
2020-03-01 20:59:13 +00:00
}
2020-08-01 16:36:17 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bDiscordPresence , n - > T ( " Send Discord Presence information " ) ) ) ;
2020-03-19 08:21:00 +00:00
2020-08-01 16:36:17 +00:00
networkingSettings - > Add ( new ItemHeader ( n - > T ( " AdHoc Server " ) ) ) ;
networkingSettings - > Add ( new CheckBox ( & g_Config . bEnableAdhocServer , n - > T ( " Enable built-in PRO Adhoc Server " , " Enable built-in PRO Adhoc Server " ) ) ) ;
2020-11-22 17:02:23 +00:00
networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . proAdhocServer , n - > T ( " Change proAdhocServer Address " , " Change proAdhocServer Address (localhost = multiple instance) " ) , ( const char * ) nullptr ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeproAdhocServerAddress ) ;
2020-08-01 16:36:17 +00:00
networkingSettings - > Add ( new ItemHeader ( n - > T ( " UPnP (port-forwarding) " ) ) ) ;
2020-03-19 08:21:00 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bEnableUPnP , n - > T ( " Enable UPnP " , " Enable UPnP (need a few seconds to detect) " ) ) ) ;
2020-08-01 16:36:17 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bUPnPUseOriginalPort , n - > T ( " UPnP use original port " , " UPnP use original port (Enabled = PSP compatibility) " ) ) ) - > SetEnabledPtr ( & g_Config . bEnableUPnP ) ;
2015-01-04 10:59:43 +00:00
2020-03-23 21:39:09 +00:00
networkingSettings - > Add ( new ItemHeader ( n - > T ( " Chat " ) ) ) ;
2016-10-21 12:40:11 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bEnableNetworkChat , n - > T ( " Enable network chat " , " Enable network chat " ) ) ) ;
2020-03-23 21:39:09 +00:00
static const char * chatButtonPositions [ ] = { " Bottom Left " , " Bottom Center " , " Bottom Right " , " Top Left " , " Top Center " , " Top Right " , " Center Left " , " Center Right " } ;
networkingSettings - > Add ( new PopupMultiChoice ( & g_Config . iChatButtonPosition , n - > T ( " Chat Button Position " ) , chatButtonPositions , 0 , ARRAY_SIZE ( chatButtonPositions ) , n - > GetName ( ) , screenManager ( ) ) ) - > SetEnabledPtr ( & g_Config . bEnableNetworkChat ) ;
static const char * chatScreenPositions [ ] = { " Bottom Left " , " Bottom Center " , " Bottom Right " , " Top Left " , " Top Center " , " Top Right " } ;
networkingSettings - > Add ( new PopupMultiChoice ( & g_Config . iChatScreenPosition , n - > T ( " Chat Screen Position " ) , chatScreenPositions , 0 , ARRAY_SIZE ( chatScreenPositions ) , n - > GetName ( ) , screenManager ( ) ) ) - > SetEnabledPtr ( & g_Config . bEnableNetworkChat ) ;
networkingSettings - > Add ( new ItemHeader ( n - > T ( " QuickChat " , " Quick Chat " ) ) ) ;
2020-03-28 21:25:48 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bEnableQuickChat , n - > T ( " EnableQuickChat " , " Enable Quick Chat " ) ) ) ;
2017-07-06 13:43:39 +00:00
# if !defined(MOBILE_DEVICE) && !defined(USING_QT_UI) // TODO: Add all platforms where KEY_CHAR support is added
2020-03-23 21:39:09 +00:00
PopupTextInputChoice * qc1 = networkingSettings - > Add ( new PopupTextInputChoice ( & g_Config . sQuickChat0 , n - > T ( " Quick Chat 1 " ) , " " , 32 , screenManager ( ) ) ) ;
2017-07-06 13:43:39 +00:00
qc1 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
PopupTextInputChoice * qc2 = networkingSettings - > Add ( new PopupTextInputChoice ( & g_Config . sQuickChat1 , n - > T ( " Quick Chat 2 " ) , " " , 32 , screenManager ( ) ) ) ;
2017-07-06 13:43:39 +00:00
qc2 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
PopupTextInputChoice * qc3 = networkingSettings - > Add ( new PopupTextInputChoice ( & g_Config . sQuickChat2 , n - > T ( " Quick Chat 3 " ) , " " , 32 , screenManager ( ) ) ) ;
2017-07-06 13:43:39 +00:00
qc3 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
PopupTextInputChoice * qc4 = networkingSettings - > Add ( new PopupTextInputChoice ( & g_Config . sQuickChat3 , n - > T ( " Quick Chat 4 " ) , " " , 32 , screenManager ( ) ) ) ;
2017-07-06 13:43:39 +00:00
qc4 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
PopupTextInputChoice * qc5 = networkingSettings - > Add ( new PopupTextInputChoice ( & g_Config . sQuickChat4 , n - > T ( " Quick Chat 5 " ) , " " , 32 , screenManager ( ) ) ) ;
2017-07-06 13:43:39 +00:00
qc5 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
# elif defined(USING_QT_UI)
2020-03-23 21:39:09 +00:00
Choice * qc1 = networkingSettings - > Add ( new Choice ( n - > T ( " Quick Chat 1 " ) ) ) ;
2017-07-06 13:43:39 +00:00
qc1 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
qc1 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat0 ) ;
2020-03-23 21:39:09 +00:00
Choice * qc2 = networkingSettings - > Add ( new Choice ( n - > T ( " Quick Chat 2 " ) ) ) ;
2017-07-06 13:43:39 +00:00
qc2 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
qc2 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat1 ) ;
2020-03-23 21:39:09 +00:00
Choice * qc3 = networkingSettings - > Add ( new Choice ( n - > T ( " Quick Chat 3 " ) ) ) ;
2017-07-06 13:43:39 +00:00
qc3 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
qc3 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat2 ) ;
2020-03-23 21:39:09 +00:00
Choice * qc4 = networkingSettings - > Add ( new Choice ( n - > T ( " Quick Chat 4 " ) ) ) ;
2017-07-06 13:43:39 +00:00
qc4 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
qc4 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat3 ) ;
2020-03-23 21:39:09 +00:00
Choice * qc5 = networkingSettings - > Add ( new Choice ( n - > T ( " Quick Chat 5 " ) ) ) ;
2017-07-06 13:43:39 +00:00
qc5 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
qc5 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat4 ) ;
# elif defined(__ANDROID__)
2020-03-23 21:39:09 +00:00
ChoiceWithValueDisplay * qc1 = networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sQuickChat0 , n - > T ( " Quick Chat 1 " ) , ( const char * ) nullptr ) ) ;
2017-07-06 13:43:39 +00:00
qc1 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat0 ) ;
qc1 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
ChoiceWithValueDisplay * qc2 = networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sQuickChat1 , n - > T ( " Quick Chat 2 " ) , ( const char * ) nullptr ) ) ;
2017-07-06 13:43:39 +00:00
qc2 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat1 ) ;
qc2 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
ChoiceWithValueDisplay * qc3 = networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sQuickChat2 , n - > T ( " Quick Chat 3 " ) , ( const char * ) nullptr ) ) ;
2017-07-06 13:43:39 +00:00
qc3 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat2 ) ;
qc3 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
ChoiceWithValueDisplay * qc4 = networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sQuickChat3 , n - > T ( " Quick Chat 4 " ) , ( const char * ) nullptr ) ) ;
2017-07-06 13:43:39 +00:00
qc4 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat3 ) ;
qc4 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
2020-03-23 21:39:09 +00:00
ChoiceWithValueDisplay * qc5 = networkingSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sQuickChat4 , n - > T ( " Quick Chat 5 " ) , ( const char * ) nullptr ) ) ;
2017-07-06 13:43:39 +00:00
qc5 - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeQuickChat4 ) ;
qc5 - > SetEnabledPtr ( & g_Config . bEnableQuickChat ) ;
# endif
2017-08-08 20:19:28 +00:00
2020-11-22 17:02:23 +00:00
networkingSettings - > Add ( new ItemHeader ( n - > T ( " Misc " , " Misc (default = compatibility) " ) ) ) ;
2020-08-01 16:36:17 +00:00
networkingSettings - > Add ( new PopupSliderChoice ( & g_Config . iPortOffset , 0 , 60000 , n - > T ( " Port offset " , " Port offset (0 = PSP compatibility) " ) , 100 , screenManager ( ) ) ) ;
2020-10-31 06:15:24 +00:00
networkingSettings - > Add ( new PopupSliderChoice ( & g_Config . iMinTimeout , 0 , 15000 , n - > T ( " Minimum Timeout " , " Minimum Timeout (override in ms, 0 = default) " ) , 50 , screenManager ( ) ) ) ;
2020-10-07 18:38:43 +00:00
networkingSettings - > Add ( new CheckBox ( & g_Config . bForcedFirstConnect , n - > T ( " Forced First Connect " , " Forced First Connect (faster Connect) " ) ) ) ;
2020-08-01 16:36:17 +00:00
2015-06-12 18:37:42 +00:00
ViewGroup * toolsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2016-01-23 06:52:13 +00:00
toolsScroll - > SetTag ( " GameSettingsTools " ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * tools = new LinearLayoutList ( ORIENT_VERTICAL ) ;
2015-06-12 18:37:42 +00:00
tools - > SetSpacing ( 0 ) ;
toolsScroll - > Add ( tools ) ;
tabHolder - > AddTab ( ms - > T ( " Tools " ) , toolsScroll ) ;
tools - > Add ( new ItemHeader ( ms - > T ( " Tools " ) ) ) ;
2015-07-04 20:05:17 +00:00
// These were moved here so use the wrong translation objects, to avoid having to change all inis... This isn't a sustainable situation :P
2015-06-21 14:49:21 +00:00
tools - > Add ( new Choice ( sa - > T ( " Savedata Manager " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnSavedataManager ) ;
2015-06-30 03:28:31 +00:00
tools - > Add ( new Choice ( dev - > T ( " System Information " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnSysInfo ) ;
2015-07-04 20:05:17 +00:00
tools - > Add ( new Choice ( sy - > T ( " Developer Tools " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnDeveloperTools ) ;
2017-08-16 22:21:00 +00:00
tools - > Add ( new Choice ( ri - > T ( " Remote disc streaming " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnRemoteISO ) ;
2015-06-12 18:37:42 +00:00
2013-07-20 14:03:52 +00:00
// System
2013-06-09 10:41:12 +00:00
ViewGroup * systemSettingsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
2016-01-23 06:52:13 +00:00
systemSettingsScroll - > SetTag ( " GameSettingsSystem " ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * systemSettings = new LinearLayoutList ( ORIENT_VERTICAL ) ;
2013-08-19 22:49:25 +00:00
systemSettings - > SetSpacing ( 0 ) ;
2013-06-09 10:41:12 +00:00
systemSettingsScroll - > Add ( systemSettings ) ;
2013-08-11 15:25:50 +00:00
tabHolder - > AddTab ( ms - > T ( " System " ) , systemSettingsScroll ) ;
2013-08-17 21:49:06 +00:00
2021-03-23 22:41:16 +00:00
systemSettings - > Add ( new ItemHeader ( sy - > T ( " UI " ) ) ) ;
2015-06-30 03:28:31 +00:00
systemSettings - > Add ( new Choice ( dev - > T ( " Language " , " Language " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnLanguage ) ;
2020-10-22 18:17:02 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bUISound , sy - > T ( " UI Sound " ) ) ) ;
2021-05-05 23:31:38 +00:00
const Path bgPng = GetSysDirectory ( DIRECTORY_SYSTEM ) / " background.png " ;
const Path bgJpg = GetSysDirectory ( DIRECTORY_SYSTEM ) / " background.jpg " ;
2021-03-23 22:41:16 +00:00
if ( File : : Exists ( bgPng ) | | File : : Exists ( bgJpg ) ) {
backgroundChoice_ = systemSettings - > Add ( new Choice ( sy - > T ( " Clear UI background " ) ) ) ;
} else if ( System_GetPropertyBool ( SYSPROP_HAS_IMAGE_BROWSER ) ) {
backgroundChoice_ = systemSettings - > Add ( new Choice ( sy - > T ( " Set UI background... " ) ) ) ;
} else {
backgroundChoice_ = nullptr ;
}
if ( backgroundChoice_ ! = nullptr ) {
backgroundChoice_ - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeBackground ) ;
}
2021-04-04 17:48:42 +00:00
static const char * backgroundAnimations [ ] = { " No animation " , " Floating symbols " , " Recent games " } ;
2021-03-23 22:41:16 +00:00
systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iBackgroundAnimation , sy - > T ( " UI background animation " ) , backgroundAnimations , 0 , ARRAY_SIZE ( backgroundAnimations ) , sy - > GetName ( ) , screenManager ( ) ) ) ;
2013-10-20 15:33:18 +00:00
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new ItemHeader ( sy - > T ( " Help the PPSSPP team " ) ) ) ;
2015-01-10 23:09:17 +00:00
enableReports_ = Reporting : : IsEnabled ( ) ;
2015-07-01 23:00:04 +00:00
enableReportsCheckbox_ = new CheckBox ( & enableReports_ , sy - > T ( " Enable Compatibility Server Reports " ) ) ;
2015-01-10 23:09:17 +00:00
enableReportsCheckbox_ - > SetEnabled ( Reporting : : IsSupported ( ) ) ;
systemSettings - > Add ( enableReportsCheckbox_ ) ;
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new ItemHeader ( sy - > T ( " Emulation " ) ) ) ;
2015-01-10 23:09:17 +00:00
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bFastMemory , sy - > T ( " Fast Memory " , " Fast Memory (Unstable) " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnJitAffectingSetting ) ;
2019-02-12 12:29:37 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bIgnoreBadMemAccess , sy - > T ( " Ignore bad memory accesses " ) ) ) ;
2013-08-18 17:51:40 +00:00
2020-07-05 08:37:44 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bSeparateIOThread , sy - > T ( " I/O on thread (experimental) " ) ) ) - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2014-12-26 09:18:52 +00:00
static const char * ioTimingMethods [ ] = { " Fast (lag on slow storage) " , " Host (bugs, less lag) " , " Simulate UMD delays " } ;
2015-09-23 10:43:45 +00:00
View * ioTimingMethod = systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iIOTimingMethod , sy - > T ( " IO timing method " ) , ioTimingMethods , 0 , ARRAY_SIZE ( ioTimingMethods ) , sy - > GetName ( ) , screenManager ( ) ) ) ;
2020-07-05 08:37:44 +00:00
ioTimingMethod - > SetEnabledPtr ( & g_Config . bSeparateIOThread ) ;
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bForceLagSync , sy - > T ( " Force real clock sync (slower, less lag) " ) ) ) ;
2015-12-28 00:34:51 +00:00
PopupSliderChoice * lockedMhz = systemSettings - > Add ( new PopupSliderChoice ( & g_Config . iLockedCPUSpeed , 0 , 1000 , sy - > T ( " Change CPU Clock " , " Change CPU Clock (unstable) " ) , screenManager ( ) , sy - > T ( " MHz, 0:default " ) ) ) ;
2020-03-22 01:49:36 +00:00
lockedMhz - > OnChange . Add ( [ & ] ( UI : : EventParams & ) {
enableReportsCheckbox_ - > SetEnabled ( Reporting : : IsSupported ( ) ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2015-12-20 20:58:24 +00:00
lockedMhz - > SetZeroLabel ( sy - > T ( " Auto " ) ) ;
2015-12-28 00:34:51 +00:00
PopupSliderChoice * rewindFreq = systemSettings - > Add ( new PopupSliderChoice ( & g_Config . iRewindFlipFrequency , 0 , 1800 , sy - > T ( " Rewind Snapshot Frequency " , " Rewind Snapshot Frequency (mem hog) " ) , screenManager ( ) , sy - > T ( " frames, 0:off " ) ) ) ;
2015-12-20 20:58:24 +00:00
rewindFreq - > SetZeroLabel ( sy - > T ( " Off " ) ) ;
2013-08-18 17:51:40 +00:00
2016-08-06 04:27:53 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bMemStickInserted , sy - > T ( " Memory Stick inserted " ) ) ) ;
2021-02-15 17:28:07 +00:00
systemSettings - > Add ( new PopupSliderChoice ( & g_Config . iMemStickSizeGB , 1 , 32 , sy - > T ( " Change Memory Stick Size " , " Change Memory Stick Size(GB) " ) , screenManager ( ) , " GB " ) ) ;
2016-08-06 04:27:53 +00:00
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new ItemHeader ( sy - > T ( " General " ) ) ) ;
2015-01-10 23:09:17 +00:00
2017-06-05 15:32:49 +00:00
# if PPSSPP_PLATFORM(ANDROID)
2015-04-03 09:50:03 +00:00
if ( System_GetPropertyInt ( SYSPROP_DEVICE_TYPE ) = = DEVICE_TYPE_MOBILE ) {
2018-03-19 21:05:23 +00:00
static const char * screenRotation [ ] = { " Auto " , " Landscape " , " Portrait " , " Landscape Reversed " , " Portrait Reversed " , " Landscape Auto " } ;
2018-03-19 18:38:42 +00:00
PopupMultiChoice * rot = systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iScreenRotation , co - > T ( " Screen Rotation " ) , screenRotation , 0 , ARRAY_SIZE ( screenRotation ) , co - > GetName ( ) , screenManager ( ) ) ) ;
2015-04-03 09:50:03 +00:00
rot - > OnChoice . Handle ( this , & GameSettingsScreen : : OnScreenRotation ) ;
2017-06-09 13:29:57 +00:00
if ( System_GetPropertyBool ( SYSPROP_SUPPORTS_SUSTAINED_PERF_MODE ) ) {
systemSettings - > Add ( new CheckBox ( & g_Config . bSustainedPerformanceMode , sy - > T ( " Sustained performance mode " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnSustainedPerformanceModeChange ) ;
}
2015-04-03 09:50:03 +00:00
}
2015-01-10 23:09:17 +00:00
# endif
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bCheckForNewVersion , sy - > T ( " VersionCheck " , " Check for new versions of PPSSPP " ) ) ) ;
2017-04-02 17:50:09 +00:00
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new Choice ( sy - > T ( " Restore Default Settings " ) ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnRestoreDefaultSettings ) ;
2018-03-18 06:13:20 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bEnableStateUndo , sy - > T ( " Savestate slot backups " ) ) ) ;
2018-06-21 08:00:57 +00:00
static const char * autoLoadSaveStateChoices [ ] = { " Off " , " Oldest Save " , " Newest Save " , " Slot 1 " , " Slot 2 " , " Slot 3 " , " Slot 4 " , " Slot 5 " } ;
systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iAutoLoadSaveState , sy - > T ( " Auto Load Savestate " ) , autoLoadSaveStateChoices , 0 , ARRAY_SIZE ( autoLoadSaveStateChoices ) , sy - > GetName ( ) , screenManager ( ) ) ) ;
2020-03-10 00:36:52 +00:00
# if defined(USING_WIN_UI) || defined(USING_QT_UI) || PPSSPP_PLATFORM(ANDROID)
systemSettings - > Add ( new CheckBox ( & g_Config . bBypassOSKWithKeyboard , sy - > T ( " Use system native keyboard " ) ) ) ;
2014-05-25 01:26:30 +00:00
# endif
2019-02-18 17:15:15 +00:00
# if PPSSPP_PLATFORM(ANDROID)
2021-05-05 23:31:38 +00:00
memstickDisplay_ = g_Config . memStickDirectory . ToVisualString ( ) ;
auto memstickPath = systemSettings - > Add ( new ChoiceWithValueDisplay ( & memstickDisplay_ , sy - > T ( " Change Memory Stick folder " ) , ( const char * ) nullptr ) ) ;
2019-02-18 17:15:15 +00:00
memstickPath - > SetEnabled ( ! PSP_IsInited ( ) ) ;
memstickPath - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeMemStickDir ) ;
# elif defined(_WIN32) && !PPSSPP_PLATFORM(UWP)
2015-07-01 23:00:04 +00:00
SavePathInMyDocumentChoice = systemSettings - > Add ( new CheckBox ( & installed_ , sy - > T ( " Save path in My Documents " , " Save path in My Documents " ) ) ) ;
2020-04-11 17:46:06 +00:00
SavePathInMyDocumentChoice - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2014-10-26 00:35:11 +00:00
SavePathInMyDocumentChoice - > OnClick . Handle ( this , & GameSettingsScreen : : OnSavePathMydoc ) ;
2015-07-01 23:00:04 +00:00
SavePathInOtherChoice = systemSettings - > Add ( new CheckBox ( & otherinstalled_ , sy - > T ( " Save path in installed.txt " , " Save path in installed.txt " ) ) ) ;
2014-10-23 14:22:11 +00:00
SavePathInOtherChoice - > SetEnabled ( false ) ;
SavePathInOtherChoice - > OnClick . Handle ( this , & GameSettingsScreen : : OnSavePathOther ) ;
2020-01-04 18:57:23 +00:00
const bool myDocsExists = W32Util : : UserDocumentsPath ( ) . size ( ) ! = 0 ;
2021-05-05 23:31:38 +00:00
const Path PPSSPPpath = Path ( File : : GetExeDirectory ( ) ) ;
const Path installedFile = PPSSPPpath / " installed.txt " ;
2014-11-03 00:53:15 +00:00
installed_ = File : : Exists ( installedFile ) ;
otherinstalled_ = false ;
2020-01-04 18:57:23 +00:00
if ( ! installed_ & & myDocsExists ) {
2021-05-05 23:31:38 +00:00
if ( File : : CreateEmptyFile ( PPSSPPpath / " installedTEMP.txt " ) ) {
2014-10-26 00:35:11 +00:00
// Disable the setting whether cannot create & delete file
2021-05-05 23:31:38 +00:00
if ( ! ( File : : Delete ( PPSSPPpath / " installedTEMP.txt " ) ) )
2014-10-26 00:35:11 +00:00
SavePathInMyDocumentChoice - > SetEnabled ( false ) ;
2014-10-27 10:48:48 +00:00
else
2020-04-11 17:46:06 +00:00
SavePathInOtherChoice - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2015-01-10 23:09:17 +00:00
} else
2014-10-23 14:22:11 +00:00
SavePathInMyDocumentChoice - > SetEnabled ( false ) ;
2015-01-10 23:09:17 +00:00
} else {
2020-01-04 18:57:23 +00:00
if ( installed_ & & myDocsExists ) {
2021-05-09 23:15:57 +00:00
FILE * testInstalled = File : : OpenCFile ( installedFile , " rt " ) ;
if ( testInstalled ) {
char temp [ 2048 ] ;
char * tempStr = fgets ( temp , sizeof ( temp ) , testInstalled ) ;
2014-10-24 14:21:49 +00:00
// Skip UTF-8 encoding bytes if there are any. There are 3 of them.
2021-05-09 23:15:57 +00:00
if ( tempStr & & strncmp ( tempStr , " \xEF \xBB \xBF " , 3 ) = = 0 ) {
tempStr + = 3 ;
}
2020-04-11 17:46:06 +00:00
SavePathInOtherChoice - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2021-05-09 23:15:57 +00:00
if ( tempStr & & strlen ( tempStr ) ! = 0 & & strcmp ( tempStr , " \n " ) ! = 0 ) {
2014-11-03 00:53:15 +00:00
installed_ = false ;
otherinstalled_ = true ;
2014-10-24 14:21:49 +00:00
}
2021-05-09 23:15:57 +00:00
fclose ( testInstalled ) ;
2014-10-23 14:22:11 +00:00
}
2020-01-04 18:57:23 +00:00
} else if ( ! myDocsExists ) {
2014-10-24 14:21:49 +00:00
SavePathInMyDocumentChoice - > SetEnabled ( false ) ;
2020-01-04 18:57:23 +00:00
}
2015-01-10 23:09:17 +00:00
}
2014-10-23 14:22:11 +00:00
# endif
2013-10-15 06:06:37 +00:00
2021-03-03 05:49:21 +00:00
# if PPSSPP_ARCH(AMD64)
2020-04-11 17:46:06 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bCacheFullIsoInRam , sy - > T ( " Cache ISO in RAM " , " Cache full ISO in RAM " ) ) ) - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2014-10-30 23:14:00 +00:00
# endif
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new ItemHeader ( sy - > T ( " Cheats " , " Cheats (experimental, see forums) " ) ) ) ;
2020-03-22 01:49:36 +00:00
CheckBox * enableCheats = systemSettings - > Add ( new CheckBox ( & g_Config . bEnableCheats , sy - > T ( " Enable Cheats " ) ) ) ;
enableCheats - > OnClick . Add ( [ & ] ( UI : : EventParams & ) {
enableReportsCheckbox_ - > SetEnabled ( Reporting : : IsSupported ( ) ) ;
return UI : : EVENT_CONTINUE ;
} ) ;
2013-12-10 22:19:37 +00:00
systemSettings - > SetSpacing ( 0 ) ;
2013-08-20 16:03:52 +00:00
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new ItemHeader ( sy - > T ( " PSP Settings " ) ) ) ;
2019-06-10 20:57:15 +00:00
static const char * models [ ] = { " PSP-1000 " , " PSP-2000/3000 " } ;
2015-09-23 10:43:45 +00:00
systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iPSPModel , sy - > T ( " PSP Model " ) , models , 0 , ARRAY_SIZE ( models ) , sy - > GetName ( ) , screenManager ( ) ) ) - > SetEnabled ( ! PSP_IsInited ( ) ) ;
2013-09-28 06:21:59 +00:00
// TODO: Come up with a way to display a keyboard for mobile users,
// so until then, this is Windows/Desktop only.
2019-01-06 22:46:43 +00:00
# if !defined(MOBILE_DEVICE) // TODO: Add all platforms where KEY_CHAR support is added
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new PopupTextInputChoice ( & g_Config . sNickName , sy - > T ( " Change Nickname " ) , " " , 32 , screenManager ( ) ) ) ;
2016-10-12 09:13:16 +00:00
# elif defined(__ANDROID__)
2018-03-25 12:26:44 +00:00
systemSettings - > Add ( new ChoiceWithValueDisplay ( & g_Config . sNickName , sy - > T ( " Change Nickname " ) , ( const char * ) nullptr ) ) - > OnClick . Handle ( this , & GameSettingsScreen : : OnChangeNickname ) ;
2013-12-08 10:16:18 +00:00
# endif
2019-01-06 22:46:43 +00:00
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bScreenshotsAsPNG , sy - > T ( " Screenshots as PNG " ) ) ) ;
2019-05-02 20:56:25 +00:00
# if defined(_WIN32) || (defined(USING_QT_UI) && !defined(MOBILE_DEVICE))
2016-09-03 22:26:01 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bDumpFrames , sy - > T ( " Record Display " ) ) ) ;
systemSettings - > Add ( new CheckBox ( & g_Config . bUseFFV1 , sy - > T ( " Use Lossless Video Codec (FFV1) " ) ) ) ;
2019-06-04 08:30:47 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bDumpVideoOutput , sy - > T ( " Use output buffer (with overlay) for recording " ) ) ) ;
2016-09-04 16:52:14 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bDumpAudio , sy - > T ( " Record Audio " ) ) ) ;
2017-11-14 04:12:27 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bSaveLoadResetsAVdumping , sy - > T ( " Reset Recording on Save/Load State " ) ) ) ;
2013-11-29 15:46:47 +00:00
# endif
2015-07-01 23:00:04 +00:00
systemSettings - > Add ( new CheckBox ( & g_Config . bDayLightSavings , sy - > T ( " Day Light Saving " ) ) ) ;
2013-07-21 20:15:18 +00:00
static const char * dateFormat [ ] = { " YYYYMMDD " , " MMDDYYYY " , " DDMMYYYY " } ;
2020-07-15 01:59:23 +00:00
systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iDateFormat , sy - > T ( " Date Format " ) , dateFormat , 0 , 3 , sy - > GetName ( ) , screenManager ( ) ) ) ;
static const char * timeFormat [ ] = { " 24HR " , " 12HR " } ;
systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iTimeFormat , sy - > T ( " Time Format " ) , timeFormat , 0 , 2 , sy - > GetName ( ) , screenManager ( ) ) ) ;
2013-08-21 09:17:55 +00:00
static const char * buttonPref [ ] = { " Use O to confirm " , " Use X to confirm " } ;
2015-09-23 10:43:45 +00:00
systemSettings - > Add ( new PopupMultiChoice ( & g_Config . iButtonPreference , sy - > T ( " Confirmation Button " ) , buttonPref , 0 , 2 , sy - > GetName ( ) , screenManager ( ) ) ) ;
2013-06-08 20:42:31 +00:00
}
2014-07-22 07:55:12 +00:00
UI : : EventReturn GameSettingsScreen : : OnAutoFrameskip ( UI : : EventParams & e ) {
if ( g_Config . bAutoFrameSkip & & g_Config . iFrameSkip = = 0 ) {
g_Config . iFrameSkip = 1 ;
}
2015-02-09 22:10:57 +00:00
if ( g_Config . bAutoFrameSkip & & g_Config . iRenderingMode = = FB_NON_BUFFERED_MODE ) {
g_Config . iRenderingMode = FB_BUFFERED_MODE ;
}
2014-07-22 07:55:12 +00:00
return UI : : EVENT_DONE ;
}
2014-06-10 18:00:11 +00:00
UI : : EventReturn GameSettingsScreen : : OnSoftwareRendering ( UI : : EventParams & e ) {
2018-01-19 23:05:59 +00:00
tessHWEnable_ = DoesBackendSupportHWTess ( ) & & ! g_Config . bSoftwareRendering & & g_Config . bHardwareTransform ;
2014-06-10 18:00:11 +00:00
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnHardwareTransform ( UI : : EventParams & e ) {
2018-01-19 23:05:59 +00:00
tessHWEnable_ = DoesBackendSupportHWTess ( ) & & ! g_Config . bSoftwareRendering & & g_Config . bHardwareTransform ;
2014-06-10 18:00:11 +00:00
return UI : : EVENT_DONE ;
}
2014-02-04 11:58:37 +00:00
UI : : EventReturn GameSettingsScreen : : OnScreenRotation ( UI : : EventParams & e ) {
2020-08-15 14:13:24 +00:00
INFO_LOG ( SYSTEM , " New display rotation: %d " , g_Config . iScreenRotation ) ;
INFO_LOG ( SYSTEM , " Sending rotate " ) ;
2014-02-04 11:58:37 +00:00
System_SendMessage ( " rotate " , " " ) ;
2020-08-15 14:13:24 +00:00
INFO_LOG ( SYSTEM , " Got back from rotate " ) ;
2014-02-04 11:58:37 +00:00
return UI : : EVENT_DONE ;
}
2019-10-02 20:03:02 +00:00
void RecreateActivity ( ) {
2014-07-20 22:35:36 +00:00
const int SYSTEM_JELLYBEAN = 16 ;
if ( System_GetPropertyInt ( SYSPROP_SYSTEMVERSION ) > = SYSTEM_JELLYBEAN ) {
2020-08-15 14:13:24 +00:00
INFO_LOG ( SYSTEM , " Sending recreate " ) ;
2014-07-20 22:35:36 +00:00
System_SendMessage ( " recreate " , " " ) ;
2020-08-15 14:13:24 +00:00
INFO_LOG ( SYSTEM , " Got back from recreate " ) ;
2014-07-20 22:35:36 +00:00
} else {
2020-01-26 18:43:18 +00:00
auto gr = GetI18NCategory ( " Graphics " ) ;
2015-07-01 21:50:16 +00:00
System_SendMessage ( " toast " , gr - > T ( " Must Restart " , " You must restart PPSSPP for this change to take effect " ) ) ;
2014-07-20 22:35:36 +00:00
}
}
2015-01-29 21:15:42 +00:00
UI : : EventReturn GameSettingsScreen : : OnAdhocGuides ( UI : : EventParams & e ) {
2017-11-14 11:50:27 +00:00
LaunchBrowser ( " https://forums.ppsspp.org/forumdisplay.php?fid=34 " ) ;
2015-01-29 21:15:42 +00:00
return UI : : EVENT_DONE ;
}
2014-02-09 22:16:08 +00:00
UI : : EventReturn GameSettingsScreen : : OnImmersiveModeChange ( UI : : EventParams & e ) {
System_SendMessage ( " immersive " , " " ) ;
2014-07-20 22:35:36 +00:00
if ( g_Config . iAndroidHwScale ! = 0 ) {
RecreateActivity ( ) ;
}
2014-02-09 22:16:08 +00:00
return UI : : EVENT_DONE ;
}
2017-06-09 13:29:57 +00:00
UI : : EventReturn GameSettingsScreen : : OnSustainedPerformanceModeChange ( UI : : EventParams & e ) {
System_SendMessage ( " sustainedPerfMode " , " " ) ;
return UI : : EVENT_DONE ;
}
2013-10-29 15:22:36 +00:00
UI : : EventReturn GameSettingsScreen : : OnRenderingMode ( UI : : EventParams & e ) {
2013-10-30 10:28:14 +00:00
// We do not want to report when rendering mode is Framebuffer to memory - so many issues
// are caused by that (framebuffer copies overwriting display lists, etc).
2014-02-16 04:34:03 +00:00
Reporting : : UpdateConfig ( ) ;
2013-10-29 15:22:36 +00:00
enableReports_ = Reporting : : IsEnabled ( ) ;
enableReportsCheckbox_ - > SetEnabled ( Reporting : : IsSupported ( ) ) ;
2013-10-30 10:28:14 +00:00
2015-02-09 22:10:57 +00:00
if ( g_Config . iRenderingMode = = FB_NON_BUFFERED_MODE ) {
g_Config . bAutoFrameSkip = false ;
}
2013-10-29 15:22:36 +00:00
return UI : : EVENT_DONE ;
}
2014-05-27 06:39:53 +00:00
UI : : EventReturn GameSettingsScreen : : OnJitAffectingSetting ( UI : : EventParams & e ) {
NativeMessageReceived ( " clear jit " , " " ) ;
return UI : : EVENT_DONE ;
}
2019-02-18 17:15:15 +00:00
# if PPSSPP_PLATFORM(ANDROID)
UI : : EventReturn GameSettingsScreen : : OnChangeMemStickDir ( UI : : EventParams & e ) {
2020-01-26 18:43:18 +00:00
auto sy = GetI18NCategory ( " System " ) ;
2021-05-05 23:31:38 +00:00
System_InputBoxGetString ( sy - > T ( " Memory Stick Folder " ) , g_Config . memStickDirectory . ToString ( ) , [ & ] ( bool result , const std : : string & value ) {
2020-03-09 02:54:24 +00:00
auto sy = GetI18NCategory ( " System " ) ;
auto di = GetI18NCategory ( " Dialog " ) ;
if ( result ) {
std : : string newPath = value ;
size_t pos = newPath . find_last_not_of ( " / " ) ;
// Gotta have at least something but a /, and also needs to start with a /.
if ( newPath . empty ( ) | | pos = = newPath . npos | | newPath [ 0 ] ! = ' / ' ) {
settingInfo_ - > Show ( sy - > T ( " ChangingMemstickPathInvalid " , " That path couldn't be used to save Memory Stick files. " ) , nullptr ) ;
return ;
}
if ( pos ! = newPath . size ( ) - 1 ) {
newPath = newPath . substr ( 0 , pos + 1 ) ;
}
pendingMemstickFolder_ = newPath ;
std : : string promptMessage = sy - > T ( " ChangingMemstickPath " , " Save games, save states, and other data will not be copied to this folder. \n \n Change the Memory Stick folder? " ) ;
2021-05-09 13:02:46 +00:00
if ( ! File : : Exists ( Path ( newPath ) ) ) {
2020-03-09 02:54:24 +00:00
promptMessage = sy - > T ( " ChangingMemstickPathNotExists " , " That folder doesn't exist yet. \n \n Save games, save states, and other data will not be copied to this folder. \n \n Create a new Memory Stick folder? " ) ;
}
// Add the path for clarity and proper confirmation.
promptMessage + = " \n \n " + newPath + " / " ;
screenManager ( ) - > push ( new PromptScreen ( promptMessage , di - > T ( " Yes " ) , di - > T ( " No " ) , std : : bind ( & GameSettingsScreen : : CallbackMemstickFolder , this , std : : placeholders : : _1 ) ) ) ;
}
} ) ;
2019-02-18 17:15:15 +00:00
return UI : : EVENT_DONE ;
}
# elif defined(_WIN32) && !PPSSPP_PLATFORM(UWP)
2014-10-23 14:22:11 +00:00
UI : : EventReturn GameSettingsScreen : : OnSavePathMydoc ( UI : : EventParams & e ) {
2021-05-05 23:31:38 +00:00
const Path PPSSPPpath = Path ( File : : GetExeDirectory ( ) ) ;
const Path installedFile = installedFile / " installed.txt " ;
2014-11-03 00:53:15 +00:00
installed_ = File : : Exists ( installedFile ) ;
if ( otherinstalled_ ) {
2021-05-05 23:31:38 +00:00
File : : Delete ( PPSSPPpath / " installed.txt " ) ;
File : : CreateEmptyFile ( PPSSPPpath / " installed.txt " ) ;
2014-11-03 00:53:15 +00:00
otherinstalled_ = false ;
2020-01-04 18:57:23 +00:00
const std : : string myDocsPath = W32Util : : UserDocumentsPath ( ) + " /PPSSPP/ " ;
2021-05-05 23:31:38 +00:00
g_Config . memStickDirectory = Path ( myDocsPath ) ;
2020-01-04 18:57:23 +00:00
} else if ( installed_ ) {
2021-05-05 23:31:38 +00:00
File : : Delete ( PPSSPPpath / " installed.txt " ) ;
2014-11-03 00:53:15 +00:00
installed_ = false ;
2021-05-05 23:31:38 +00:00
g_Config . memStickDirectory = PPSSPPpath / " memstick " ;
2020-01-04 18:57:23 +00:00
} else {
2021-05-05 23:31:38 +00:00
FILE * f = File : : OpenCFile ( PPSSPPpath / " installed.txt " , " wb " ) ;
2021-05-09 22:48:36 +00:00
if ( f ) {
fclose ( f ) ;
2014-10-23 14:22:11 +00:00
}
2020-01-04 18:57:23 +00:00
const std : : string myDocsPath = W32Util : : UserDocumentsPath ( ) + " /PPSSPP/ " ;
2021-05-05 23:31:38 +00:00
g_Config . memStickDirectory = Path ( myDocsPath ) ;
2014-11-03 00:53:15 +00:00
installed_ = true ;
2014-10-23 14:22:11 +00:00
}
2014-10-26 06:50:21 +00:00
return UI : : EVENT_DONE ;
2014-10-23 14:22:11 +00:00
}
UI : : EventReturn GameSettingsScreen : : OnSavePathOther ( UI : : EventParams & e ) {
2021-05-05 23:31:38 +00:00
const Path PPSSPPpath = Path ( File : : GetExeDirectory ( ) ) ;
2014-11-03 00:53:15 +00:00
if ( otherinstalled_ ) {
2020-01-26 18:43:18 +00:00
auto di = GetI18NCategory ( " Dialog " ) ;
2014-10-27 19:10:21 +00:00
std : : string folder = W32Util : : BrowseForFolder ( MainWindow : : GetHWND ( ) , di - > T ( " Choose PPSSPP save folder " ) ) ;
2014-10-27 18:57:40 +00:00
if ( folder . size ( ) ) {
2021-05-05 23:31:38 +00:00
g_Config . memStickDirectory = Path ( folder ) ;
FILE * f = File : : OpenCFile ( PPSSPPpath / " installed.txt " , " wb " ) ;
2015-01-27 22:56:41 +00:00
if ( f ) {
std : : string utfstring ( " \xEF \xBB \xBF " ) ;
utfstring . append ( folder ) ;
2015-02-04 12:34:53 +00:00
fwrite ( utfstring . c_str ( ) , 1 , utfstring . length ( ) , f ) ;
2015-01-27 22:56:41 +00:00
fclose ( f ) ;
}
2014-11-03 00:53:15 +00:00
installed_ = false ;
2014-10-27 10:48:48 +00:00
}
2014-10-27 11:14:39 +00:00
else
2014-11-03 00:53:15 +00:00
otherinstalled_ = false ;
2014-10-27 10:48:48 +00:00
}
else {
2021-05-05 23:31:38 +00:00
File : : Delete ( PPSSPPpath / " installed.txt " ) ;
2014-10-27 10:48:48 +00:00
SavePathInMyDocumentChoice - > SetEnabled ( true ) ;
2014-11-03 00:53:15 +00:00
otherinstalled_ = false ;
installed_ = false ;
2021-05-05 23:31:38 +00:00
g_Config . memStickDirectory = PPSSPPpath / " memstick " ;
2014-10-27 10:48:48 +00:00
}
2014-10-23 14:22:11 +00:00
return UI : : EVENT_DONE ;
}
# endif
2017-04-02 17:50:09 +00:00
UI : : EventReturn GameSettingsScreen : : OnChangeBackground ( UI : : EventParams & e ) {
2021-05-05 23:31:38 +00:00
const Path bgPng = GetSysDirectory ( DIRECTORY_SYSTEM ) / " background.png " ;
const Path bgJpg = GetSysDirectory ( DIRECTORY_SYSTEM ) / " background.jpg " ;
2017-04-02 17:50:09 +00:00
if ( File : : Exists ( bgPng ) | | File : : Exists ( bgJpg ) ) {
if ( File : : Exists ( bgPng ) ) {
File : : Delete ( bgPng ) ;
}
if ( File : : Exists ( bgJpg ) ) {
File : : Delete ( bgJpg ) ;
}
NativeMessageReceived ( " bgImage_updated " , " " ) ;
} else {
2017-04-30 00:35:12 +00:00
if ( System_GetPropertyBool ( SYSPROP_HAS_IMAGE_BROWSER ) ) {
2017-04-02 17:50:09 +00:00
System_SendMessage ( " bgImage_browse " , " " ) ;
}
}
// Change to a browse or clear button.
RecreateViews ( ) ;
return UI : : EVENT_DONE ;
}
2013-10-13 17:24:49 +00:00
UI : : EventReturn GameSettingsScreen : : OnFullscreenChange ( UI : : EventParams & e ) {
2017-07-30 14:51:53 +00:00
System_SendMessage ( " toggle_fullscreen " , g_Config . bFullScreen ? " 1 " : " 0 " ) ;
2013-10-13 17:24:49 +00:00
return UI : : EVENT_DONE ;
}
2015-10-24 12:40:29 +00:00
UI : : EventReturn GameSettingsScreen : : OnDisplayLayoutEditor ( UI : : EventParams & e ) {
2015-10-31 22:20:48 +00:00
screenManager ( ) - > push ( new DisplayLayoutScreen ( ) ) ;
2015-10-24 12:40:29 +00:00
return UI : : EVENT_DONE ;
} ;
2013-09-10 22:19:34 +00:00
UI : : EventReturn GameSettingsScreen : : OnResolutionChange ( UI : : EventParams & e ) {
2014-07-18 22:42:22 +00:00
if ( g_Config . iAndroidHwScale = = 1 ) {
2014-07-20 22:35:36 +00:00
RecreateActivity ( ) ;
2014-07-18 22:42:22 +00:00
}
2014-02-09 22:04:16 +00:00
Reporting : : UpdateConfig ( ) ;
2013-09-10 22:19:34 +00:00
return UI : : EVENT_DONE ;
}
2014-07-18 19:49:54 +00:00
UI : : EventReturn GameSettingsScreen : : OnHwScaleChange ( UI : : EventParams & e ) {
2014-07-20 22:35:36 +00:00
RecreateActivity ( ) ;
2014-07-18 19:49:54 +00:00
return UI : : EVENT_DONE ;
}
2013-08-18 17:51:40 +00:00
UI : : EventReturn GameSettingsScreen : : OnDumpNextFrameToLog ( UI : : EventParams & e ) {
2013-08-18 21:11:47 +00:00
if ( gpu ) {
gpu - > DumpNextFrame ( ) ;
}
2013-08-18 17:51:40 +00:00
return UI : : EVENT_DONE ;
}
2017-03-15 05:01:18 +00:00
void GameSettingsScreen : : update ( ) {
UIScreen : : update ( ) ;
2014-05-03 20:24:46 +00:00
2018-06-17 03:07:11 +00:00
g_Config . iFpsLimit1 = iAlternateSpeedPercent1_ < 0 ? - 1 : ( iAlternateSpeedPercent1_ * 60 ) / 100 ;
g_Config . iFpsLimit2 = iAlternateSpeedPercent2_ < 0 ? - 1 : ( iAlternateSpeedPercent2_ * 60 ) / 100 ;
2014-07-22 08:37:20 +00:00
bool vertical = UseVerticalLayout ( ) ;
if ( vertical ! = lastVertical_ ) {
RecreateViews ( ) ;
lastVertical_ = vertical ;
}
2013-07-17 20:27:05 +00:00
}
2013-10-25 11:19:08 +00:00
void GameSettingsScreen : : onFinish ( DialogResult result ) {
2013-10-17 14:15:04 +00:00
if ( g_Config . bEnableSound ) {
if ( PSP_IsInited ( ) & & ! IsAudioInitialised ( ) )
2013-08-14 12:55:31 +00:00
Audio_Init ( ) ;
2013-08-14 12:44:36 +00:00
}
2013-10-17 14:15:04 +00:00
2013-09-01 19:57:39 +00:00
Reporting : : Enable ( enableReports_ , " report.ppsspp.org " ) ;
2014-02-16 04:34:03 +00:00
Reporting : : UpdateConfig ( ) ;
2019-02-23 09:49:49 +00:00
g_Config . Save ( " GameSettingsScreen::onFinish " ) ;
2016-08-05 17:46:11 +00:00
if ( editThenRestore_ ) {
2019-07-18 04:28:21 +00:00
// In case we didn't have the title yet before, try again.
std : : shared_ptr < GameInfo > info = g_gameInfoCache - > GetInfo ( nullptr , gamePath_ , 0 ) ;
g_Config . changeGameSpecific ( gameID_ , info - > GetTitle ( ) ) ;
2014-12-14 19:33:20 +00:00
g_Config . unloadGameConfig ( ) ;
}
2013-08-20 16:03:52 +00:00
2013-09-04 15:21:33 +00:00
host - > UpdateUI ( ) ;
2013-09-08 04:42:15 +00:00
2015-08-28 18:55:32 +00:00
KeyMap : : UpdateNativeMenuKeys ( ) ;
2017-03-17 09:27:49 +00:00
// Wipe some caches after potentially changing settings.
2017-04-28 03:03:50 +00:00
NativeMessageReceived ( " gpu_resized " , " " ) ;
NativeMessageReceived ( " gpu_clearCache " , " " ) ;
2013-10-25 11:19:08 +00:00
}
2021-04-11 01:42:40 +00:00
void GameSettingsScreen : : sendMessage ( const char * message , const char * value ) {
UIDialogScreenWithGameBackground : : sendMessage ( message , value ) ;
if ( ! strcmp ( message , " postshader_updated " ) ) {
g_Config . bShaderChainRequires60FPS = PostShaderChainRequires60FPS ( GetFullPostShadersChain ( g_Config . vPostShaderNames ) ) ;
RecreateViews ( ) ;
}
}
2019-02-18 17:15:15 +00:00
void GameSettingsScreen : : CallbackMemstickFolder ( bool yes ) {
2020-01-26 18:43:18 +00:00
auto sy = GetI18NCategory ( " System " ) ;
2019-02-18 17:15:15 +00:00
if ( yes ) {
std : : string memstickDirFile = g_Config . internalDataDirectory + " /memstick_dir.txt " ;
std : : string testWriteFile = pendingMemstickFolder_ + " /.write_verify_file " ;
// Already, create away.
2021-05-09 13:02:46 +00:00
if ( ! File : : Exists ( Path ( pendingMemstickFolder_ ) ) ) {
2021-05-05 23:31:38 +00:00
File : : CreateFullPath ( Path ( pendingMemstickFolder_ ) ) ;
2019-02-18 17:15:15 +00:00
}
2021-05-09 13:02:46 +00:00
if ( ! File : : WriteDataToFile ( true , " 1 " , 1 , Path ( testWriteFile ) ) ) {
2019-02-18 17:15:15 +00:00
settingInfo_ - > Show ( sy - > T ( " ChangingMemstickPathInvalid " , " That path couldn't be used to save Memory Stick files. " ) , nullptr ) ;
return ;
}
2021-05-05 23:31:38 +00:00
File : : Delete ( Path ( testWriteFile ) ) ;
2019-02-18 17:15:15 +00:00
2021-05-09 13:02:46 +00:00
File : : WriteDataToFile ( true , pendingMemstickFolder_ . c_str ( ) , ( unsigned int ) pendingMemstickFolder_ . size ( ) , Path ( memstickDirFile ) ) ;
2019-02-18 17:15:15 +00:00
// Save so the settings, at least, are transferred.
2021-05-05 23:31:38 +00:00
g_Config . memStickDirectory = Path ( pendingMemstickFolder_ ) ;
2019-02-23 09:49:49 +00:00
g_Config . Save ( " MemstickPathChanged " ) ;
2019-02-18 17:15:15 +00:00
screenManager ( ) - > RecreateAllViews ( ) ;
}
}
2020-05-09 20:52:04 +00:00
void GameSettingsScreen : : TriggerRestart ( const char * why ) {
// Extra save here to make sure the choice really gets saved even if there are shutdown bugs in
// the GPU backend code.
g_Config . Save ( why ) ;
std : : string param = " --gamesettings " ;
if ( editThenRestore_ ) {
// We won't pass the gameID, so don't resume back into settings.
param = " " ;
} else if ( ! gamePath_ . empty ( ) ) {
2021-05-05 23:31:38 +00:00
param + = " \" " + ReplaceAll ( ReplaceAll ( gamePath_ . ToString ( ) , " \\ " , " \\ \\ " ) , " \" " , " \\ \" " ) + " \" " ;
2020-05-09 20:52:04 +00:00
}
2020-08-06 08:19:58 +00:00
// Make sure the new instance is considered the first.
ShutdownInstanceCounter ( ) ;
2020-05-09 20:52:04 +00:00
System_SendMessage ( " graphics_restart " , param . c_str ( ) ) ;
}
2014-09-14 10:59:27 +00:00
void GameSettingsScreen : : CallbackRenderingBackend ( bool yes ) {
2016-01-06 06:37:28 +00:00
// If the user ends up deciding not to restart, set the config back to the current backend
2014-09-14 10:59:27 +00:00
// so it doesn't get switched by accident.
if ( yes ) {
2020-05-09 20:52:04 +00:00
TriggerRestart ( " GameSettingsScreen::RenderingBackendYes " ) ;
2014-09-14 10:59:27 +00:00
} else {
2016-01-06 06:37:28 +00:00
g_Config . iGPUBackend = ( int ) GetGPUBackend ( ) ;
2014-09-14 10:59:27 +00:00
}
}
2018-09-30 07:53:21 +00:00
void GameSettingsScreen : : CallbackRenderingDevice ( bool yes ) {
// If the user ends up deciding not to restart, set the config back to the current backend
// so it doesn't get switched by accident.
if ( yes ) {
2020-05-09 20:52:04 +00:00
TriggerRestart ( " GameSettingsScreen::RenderingDeviceYes " ) ;
2018-09-30 07:53:21 +00:00
} else {
std : : string * deviceNameSetting = GPUDeviceNameSetting ( ) ;
if ( deviceNameSetting )
* deviceNameSetting = GetGPUBackendDevice ( ) ;
// Needed to redraw the setting.
RecreateViews ( ) ;
}
}
2020-03-03 03:21:15 +00:00
void GameSettingsScreen : : CallbackInflightFrames ( bool yes ) {
if ( yes ) {
2020-05-09 20:52:04 +00:00
TriggerRestart ( " GameSettingsScreen::InflightFramesYes " ) ;
2020-03-03 03:21:15 +00:00
} else {
g_Config . iInflightFrames = prevInflightFrames_ ;
}
}
2014-09-14 10:59:27 +00:00
UI : : EventReturn GameSettingsScreen : : OnRenderingBackend ( UI : : EventParams & e ) {
2020-01-26 18:43:18 +00:00
auto di = GetI18NCategory ( " Dialog " ) ;
2014-09-14 10:59:27 +00:00
// It only makes sense to show the restart prompt if the backend was actually changed.
2016-01-06 06:37:28 +00:00
if ( g_Config . iGPUBackend ! = ( int ) GetGPUBackend ( ) ) {
2015-07-01 21:26:55 +00:00
screenManager ( ) - > push ( new PromptScreen ( di - > T ( " ChangingGPUBackends " , " Changing GPU backends requires PPSSPP to restart. Restart now? " ) , di - > T ( " Yes " ) , di - > T ( " No " ) ,
2016-10-12 09:32:24 +00:00
std : : bind ( & GameSettingsScreen : : CallbackRenderingBackend , this , std : : placeholders : : _1 ) ) ) ;
2014-09-14 10:59:27 +00:00
}
return UI : : EVENT_DONE ;
}
2018-09-30 07:53:21 +00:00
UI : : EventReturn GameSettingsScreen : : OnRenderingDevice ( UI : : EventParams & e ) {
2020-01-26 18:43:18 +00:00
auto di = GetI18NCategory ( " Dialog " ) ;
2018-09-30 07:53:21 +00:00
// It only makes sense to show the restart prompt if the device was actually changed.
std : : string * deviceNameSetting = GPUDeviceNameSetting ( ) ;
if ( deviceNameSetting & & * deviceNameSetting ! = GetGPUBackendDevice ( ) ) {
screenManager ( ) - > push ( new PromptScreen ( di - > T ( " ChangingGPUBackends " , " Changing GPU backends requires PPSSPP to restart. Restart now? " ) , di - > T ( " Yes " ) , di - > T ( " No " ) ,
std : : bind ( & GameSettingsScreen : : CallbackRenderingDevice , this , std : : placeholders : : _1 ) ) ) ;
}
return UI : : EVENT_DONE ;
}
2020-03-03 03:21:15 +00:00
UI : : EventReturn GameSettingsScreen : : OnInflightFramesChoice ( UI : : EventParams & e ) {
auto di = GetI18NCategory ( " Dialog " ) ;
if ( g_Config . iInflightFrames ! = prevInflightFrames_ ) {
screenManager ( ) - > push ( new PromptScreen ( di - > T ( " ChangingInflightFrames " , " Changing graphics command buffering requires PPSSPP to restart. Restart now? " ) , di - > T ( " Yes " ) , di - > T ( " No " ) ,
std : : bind ( & GameSettingsScreen : : CallbackInflightFrames , this , std : : placeholders : : _1 ) ) ) ;
}
return UI : : EVENT_DONE ;
}
2020-01-09 13:57:09 +00:00
UI : : EventReturn GameSettingsScreen : : OnCameraDeviceChange ( UI : : EventParams & e ) {
Camera : : onCameraDeviceChange ( ) ;
return UI : : EVENT_DONE ;
}
2020-07-31 02:24:17 +00:00
UI : : EventReturn GameSettingsScreen : : OnMicDeviceChange ( UI : : EventParams & e ) {
Microphone : : onMicDeviceChange ( ) ;
return UI : : EVENT_DONE ;
}
2019-09-15 20:23:48 +00:00
UI : : EventReturn GameSettingsScreen : : OnAudioDevice ( UI : : EventParams & e ) {
2020-01-26 18:43:18 +00:00
auto a = GetI18NCategory ( " Audio " ) ;
2019-09-15 20:42:56 +00:00
if ( g_Config . sAudioDevice = = a - > T ( " Auto " ) ) {
g_Config . sAudioDevice . clear ( ) ;
}
2019-09-15 20:23:48 +00:00
System_SendMessage ( " audio_resetDevice " , " " ) ;
return UI : : EVENT_DONE ;
2020-03-02 15:25:18 +00:00
}
2017-07-06 13:43:39 +00:00
UI : : EventReturn GameSettingsScreen : : OnChangeQuickChat0 ( UI : : EventParams & e ) {
2020-03-09 02:54:24 +00:00
# if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__)
2020-03-09 01:59:17 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
System_InputBoxGetString ( n - > T ( " Enter Quick Chat 1 " ) , g_Config . sQuickChat0 , [ ] ( bool result , const std : : string & value ) {
if ( result ) {
g_Config . sQuickChat0 = value ;
}
} ) ;
2017-07-06 13:43:39 +00:00
# endif
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnChangeQuickChat1 ( UI : : EventParams & e ) {
2020-03-09 02:54:24 +00:00
# if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__)
2020-03-09 01:59:17 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
System_InputBoxGetString ( n - > T ( " Enter Quick Chat 2 " ) , g_Config . sQuickChat1 , [ ] ( bool result , const std : : string & value ) {
if ( result ) {
g_Config . sQuickChat1 = value ;
}
} ) ;
2017-07-06 13:43:39 +00:00
# endif
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnChangeQuickChat2 ( UI : : EventParams & e ) {
2020-03-09 02:54:24 +00:00
# if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__)
2020-03-09 01:59:17 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
System_InputBoxGetString ( n - > T ( " Enter Quick Chat 3 " ) , g_Config . sQuickChat2 , [ ] ( bool result , const std : : string & value ) {
if ( result ) {
g_Config . sQuickChat2 = value ;
}
} ) ;
2017-07-06 13:43:39 +00:00
# endif
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnChangeQuickChat3 ( UI : : EventParams & e ) {
2020-03-09 02:54:24 +00:00
# if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__)
2020-03-09 01:59:17 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
System_InputBoxGetString ( n - > T ( " Enter Quick Chat 4 " ) , g_Config . sQuickChat3 , [ ] ( bool result , const std : : string & value ) {
if ( result ) {
g_Config . sQuickChat3 = value ;
}
} ) ;
2017-07-06 13:43:39 +00:00
# endif
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnChangeQuickChat4 ( UI : : EventParams & e ) {
2020-03-09 02:54:24 +00:00
# if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__)
2020-03-09 01:59:17 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
System_InputBoxGetString ( n - > T ( " Enter Quick Chat 5 " ) , g_Config . sQuickChat4 , [ ] ( bool result , const std : : string & value ) {
if ( result ) {
g_Config . sQuickChat4 = value ;
}
} ) ;
2017-07-06 13:43:39 +00:00
# endif
return UI : : EVENT_DONE ;
2019-09-15 20:23:48 +00:00
}
2013-08-20 16:03:52 +00:00
UI : : EventReturn GameSettingsScreen : : OnChangeNickname ( UI : : EventParams & e ) {
2020-03-09 02:54:24 +00:00
# if PPSSPP_PLATFORM(WINDOWS) || defined(USING_QT_UI) || defined(__ANDROID__)
2020-03-09 01:59:17 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
System_InputBoxGetString ( n - > T ( " Enter a new PSP nickname " ) , g_Config . sNickName , [ ] ( bool result , const std : : string & value ) {
if ( result ) {
g_Config . sNickName = StripSpaces ( value ) ;
}
} ) ;
2013-12-07 18:57:06 +00:00
# endif
2014-05-25 05:19:56 +00:00
return UI : : EVENT_DONE ;
}
2016-08-27 18:38:05 +00:00
UI : : EventReturn GameSettingsScreen : : OnChangeproAdhocServerAddress ( UI : : EventParams & e ) {
2020-07-17 01:54:37 +00:00
auto n = GetI18NCategory ( " Networking " ) ;
2019-08-18 00:14:31 +00:00
2020-07-17 01:54:37 +00:00
screenManager ( ) - > push ( new HostnameSelectScreen ( & g_Config . proAdhocServer , n - > T ( " proAdhocServer Address: " ) ) ) ;
2016-08-27 18:38:05 +00:00
2014-05-25 05:19:56 +00:00
return UI : : EVENT_DONE ;
}
2013-08-21 08:52:40 +00:00
2014-05-25 05:19:56 +00:00
UI : : EventReturn GameSettingsScreen : : OnChangeMacAddress ( UI : : EventParams & e ) {
2017-04-29 19:48:06 +00:00
g_Config . sMACAddress = CreateRandMAC ( ) ;
2014-06-02 06:15:07 +00:00
2013-08-18 00:03:59 +00:00
return UI : : EVENT_DONE ;
}
2017-04-18 03:33:22 +00:00
UI : : EventReturn GameSettingsScreen : : OnComboKey ( UI : : EventParams & e ) {
2020-03-08 14:16:32 +00:00
screenManager ( ) - > push ( new ComboKeyScreen ( & g_Config . iComboMode ) ) ;
2015-06-28 05:34:05 +00:00
return UI : : EVENT_DONE ;
}
2013-08-20 16:03:52 +00:00
UI : : EventReturn GameSettingsScreen : : OnLanguage ( UI : : EventParams & e ) {
2020-01-26 18:43:18 +00:00
auto dev = GetI18NCategory ( " Developer " ) ;
2015-06-30 03:28:31 +00:00
auto langScreen = new NewLanguageScreen ( dev - > T ( " Language " ) ) ;
2013-09-01 20:29:23 +00:00
langScreen - > OnChoice . Handle ( this , & GameSettingsScreen : : OnLanguageChange ) ;
2017-03-22 01:27:57 +00:00
if ( e . v )
langScreen - > SetPopupOrigin ( e . v ) ;
2013-09-01 20:29:23 +00:00
screenManager ( ) - > push ( langScreen ) ;
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnLanguageChange ( UI : : EventParams & e ) {
2014-02-17 19:39:58 +00:00
screenManager ( ) - > RecreateAllViews ( ) ;
2013-11-03 00:24:19 +00:00
2013-09-07 16:48:12 +00:00
if ( host ) {
host - > UpdateUI ( ) ;
}
2013-07-17 20:27:05 +00:00
return UI : : EVENT_DONE ;
}
2013-10-12 00:05:55 +00:00
UI : : EventReturn GameSettingsScreen : : OnPostProcShaderChange ( UI : : EventParams & e ) {
2020-05-18 09:17:45 +00:00
g_Config . vPostShaderNames . erase ( std : : remove ( g_Config . vPostShaderNames . begin ( ) , g_Config . vPostShaderNames . end ( ) , " Off " ) , g_Config . vPostShaderNames . end ( ) ) ;
2021-04-11 01:42:40 +00:00
2017-04-28 03:03:50 +00:00
NativeMessageReceived ( " gpu_resized " , " " ) ;
2021-04-11 01:42:40 +00:00
NativeMessageReceived ( " postshader_updated " , " " ) ;
2013-10-12 00:05:55 +00:00
return UI : : EVENT_DONE ;
}
2016-07-03 17:24:33 +00:00
2020-08-02 04:26:41 +00:00
UI : : EventReturn GameSettingsScreen : : OnTextureShader ( UI : : EventParams & e ) {
auto gr = GetI18NCategory ( " Graphics " ) ;
auto shaderScreen = new TextureShaderScreen ( gr - > T ( " Texture Shader " ) ) ;
shaderScreen - > OnChoice . Handle ( this , & GameSettingsScreen : : OnTextureShaderChange ) ;
if ( e . v )
shaderScreen - > SetPopupOrigin ( e . v ) ;
screenManager ( ) - > push ( shaderScreen ) ;
return UI : : EVENT_DONE ;
}
UI : : EventReturn GameSettingsScreen : : OnTextureShaderChange ( UI : : EventParams & e ) {
NativeMessageReceived ( " gpu_resized " , " " ) ;
RecreateViews ( ) ; // Update setting name
2020-08-02 05:32:55 +00:00
g_Config . bTexHardwareScaling = g_Config . sTextureShaderName ! = " Off " ;
2020-08-02 04:26:41 +00:00
return UI : : EVENT_DONE ;
}
2013-08-20 16:03:52 +00:00
UI : : EventReturn GameSettingsScreen : : OnDeveloperTools ( UI : : EventParams & e ) {
2020-05-15 09:15:38 +00:00
screenManager ( ) - > push ( new DeveloperToolsScreen ( ) ) ;
return UI : : EVENT_DONE ;
2013-07-18 09:39:54 +00:00
}
2016-07-03 17:24:33 +00:00
UI : : EventReturn GameSettingsScreen : : OnRemoteISO ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new RemoteISOScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2013-07-29 00:15:30 +00:00
UI : : EventReturn GameSettingsScreen : : OnControlMapping ( UI : : EventParams & e ) {
2013-08-17 08:34:38 +00:00
screenManager ( ) - > push ( new ControlMappingScreen ( ) ) ;
2013-07-22 22:06:07 +00:00
return UI : : EVENT_DONE ;
}
2013-10-20 02:45:58 +00:00
UI : : EventReturn GameSettingsScreen : : OnTouchControlLayout ( UI : : EventParams & e ) {
2013-10-09 20:15:56 +00:00
screenManager ( ) - > push ( new TouchControlLayoutScreen ( ) ) ;
return UI : : EVENT_DONE ;
2016-07-03 17:24:33 +00:00
}
2013-10-09 20:15:56 +00:00
2013-12-14 12:55:57 +00:00
//when the tilt event type is modified, we need to reset all tilt settings.
//refer to the ResetTiltEvents() function for a detailed explanation.
2018-12-16 20:48:35 +00:00
UI : : EventReturn GameSettingsScreen : : OnTiltTypeChange ( UI : : EventParams & e ) {
2013-12-14 12:55:57 +00:00
TiltEventProcessor : : ResetTiltEvents ( ) ;
return UI : : EVENT_DONE ;
} ;
2018-12-16 20:48:35 +00:00
UI : : EventReturn GameSettingsScreen : : OnTiltCustomize ( UI : : EventParams & e ) {
2013-10-27 17:58:47 +00:00
screenManager ( ) - > push ( new TiltAnalogSettingsScreen ( ) ) ;
return UI : : EVENT_DONE ;
} ;
2015-06-12 18:37:42 +00:00
UI : : EventReturn GameSettingsScreen : : OnSavedataManager ( UI : : EventParams & e ) {
2021-05-05 23:31:38 +00:00
auto saveData = new SavedataScreen ( Path ( ) ) ;
2015-06-12 18:37:42 +00:00
screenManager ( ) - > push ( saveData ) ;
return UI : : EVENT_DONE ;
}
2015-06-29 00:56:04 +00:00
UI : : EventReturn GameSettingsScreen : : OnSysInfo ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new SystemInfoScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2013-07-18 09:39:54 +00:00
void DeveloperToolsScreen : : CreateViews ( ) {
using namespace UI ;
2017-03-22 06:59:59 +00:00
root_ = new LinearLayout ( ORIENT_VERTICAL , new LayoutParams ( FILL_PARENT , FILL_PARENT ) ) ;
ScrollView * settingsScroll = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( 1.0f ) ) ;
settingsScroll - > SetTag ( " DevToolsSettings " ) ;
root_ - > Add ( settingsScroll ) ;
2013-07-18 09:39:54 +00:00
2020-01-26 18:43:18 +00:00
auto di = GetI18NCategory ( " Dialog " ) ;
auto dev = GetI18NCategory ( " Developer " ) ;
auto gr = GetI18NCategory ( " Graphics " ) ;
auto a = GetI18NCategory ( " Audio " ) ;
auto sy = GetI18NCategory ( " System " ) ;
2013-07-18 09:39:54 +00:00
2017-03-22 06:59:59 +00:00
AddStandardBack ( root_ ) ;
2021-02-22 02:41:08 +00:00
LinearLayout * list = settingsScroll - > Add ( new LinearLayoutList ( ORIENT_VERTICAL , new LinearLayoutParams ( 1.0f ) ) ) ;
2013-08-19 22:49:25 +00:00
list - > SetSpacing ( 0 ) ;
2015-07-01 23:00:04 +00:00
list - > Add ( new ItemHeader ( sy - > T ( " General " ) ) ) ;
2013-10-20 15:33:18 +00:00
2014-05-27 06:55:48 +00:00
bool canUseJit = true ;
2016-08-28 17:00:13 +00:00
// iOS can now use JIT on all modes, apparently.
// The bool may come in handy for future non-jit platforms though (UWP XB1?)
2016-05-07 23:43:27 +00:00
2018-12-16 20:48:35 +00:00
static const char * cpuCores [ ] = { " Interpreter " , " Dynarec (JIT) " , " IR Interpreter " } ;
2016-05-07 23:43:27 +00:00
PopupMultiChoice * core = list - > Add ( new PopupMultiChoice ( & g_Config . iCpuCore , gr - > T ( " CPU Core " ) , cpuCores , 0 , ARRAY_SIZE ( cpuCores ) , sy - > GetName ( ) , screenManager ( ) ) ) ;
2016-08-20 19:31:02 +00:00
core - > OnChoice . Handle ( this , & DeveloperToolsScreen : : OnJitAffectingSetting ) ;
2016-05-07 23:43:27 +00:00
if ( ! canUseJit ) {
core - > HideChoice ( 1 ) ;
2014-05-27 07:39:07 +00:00
}
2013-10-20 15:33:18 +00:00
2019-02-04 12:00:08 +00:00
list - > Add ( new Choice ( dev - > T ( " JIT debug tools " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnJitDebugTools ) ;
2015-06-30 03:28:31 +00:00
list - > Add ( new CheckBox ( & g_Config . bShowDeveloperMenu , dev - > T ( " Show Developer Menu " ) ) ) ;
list - > Add ( new CheckBox ( & g_Config . bDumpDecryptedEboot , dev - > T ( " Dump Decrypted Eboot " , " Dump Decrypted EBOOT.BIN (If Encrypted) When Booting Game " ) ) ) ;
2013-10-12 19:34:13 +00:00
2017-02-24 23:25:46 +00:00
# if !PPSSPP_PLATFORM(UWP)
2015-06-30 03:28:31 +00:00
Choice * cpuTests = new Choice ( dev - > T ( " Run CPU Tests " ) ) ;
2013-10-12 19:34:13 +00:00
list - > Add ( cpuTests ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnRunCPUTests ) ;
2017-02-24 23:25:46 +00:00
2018-01-04 17:10:41 +00:00
cpuTests - > SetEnabled ( TestsAvailable ( ) ) ;
2017-02-24 23:25:46 +00:00
# endif
2018-12-18 22:56:36 +00:00
// For now, we only implement GPU driver tests for Vulkan and OpenGL. This is simply
// because the D3D drivers are generally solid enough to not need this type of investigation.
if ( g_Config . iGPUBackend = = ( int ) GPUBackend : : VULKAN | | g_Config . iGPUBackend = = ( int ) GPUBackend : : OPENGL ) {
list - > Add ( new Choice ( dev - > T ( " GPU Driver Test " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnGPUDriverTest ) ;
}
2021-01-31 14:19:06 +00:00
list - > Add ( new CheckBox ( & g_Config . bVendorBugChecksEnabled , dev - > T ( " Enable driver bug workarounds " ) ) ) ;
2021-01-31 14:49:52 +00:00
list - > Add ( new Choice ( dev - > T ( " Framedump tests " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnFramedumpTest ) ;
2019-10-02 20:03:02 +00:00
list - > Add ( new Choice ( dev - > T ( " Touchscreen Test " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnTouchscreenTest ) ;
2013-10-12 19:34:13 +00:00
2018-09-01 18:00:05 +00:00
allowDebugger_ = ! WebServerStopped ( WebServerFlags : : DEBUGGER ) ;
canAllowDebugger_ = ! WebServerStopping ( WebServerFlags : : DEBUGGER ) ;
CheckBox * allowDebugger = new CheckBox ( & allowDebugger_ , dev - > T ( " Allow remote debugger " ) ) ;
list - > Add ( allowDebugger ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnRemoteDebugger ) ;
allowDebugger - > SetEnabledPtr ( & canAllowDebugger_ ) ;
2020-11-22 18:08:14 +00:00
list - > Add ( new CheckBox ( & g_Config . bShowOnScreenMessages , dev - > T ( " Show on-screen messages " ) ) ) ;
2015-06-30 03:28:31 +00:00
list - > Add ( new CheckBox ( & g_Config . bEnableLogging , dev - > T ( " Enable Logging " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnLoggingChanged ) ;
2017-03-24 02:16:17 +00:00
list - > Add ( new CheckBox ( & g_Config . bLogFrameDrops , dev - > T ( " Log Dropped Frame Statistics " ) ) ) ;
2015-06-30 03:28:31 +00:00
list - > Add ( new Choice ( dev - > T ( " Logging Channels " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnLogConfig ) ;
list - > Add ( new ItemHeader ( dev - > T ( " Language " ) ) ) ;
list - > Add ( new Choice ( dev - > T ( " Load language ini " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnLoadLanguageIni ) ;
list - > Add ( new Choice ( dev - > T ( " Save language ini " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnSaveLanguageIni ) ;
2016-06-21 22:33:06 +00:00
list - > Add ( new ItemHeader ( dev - > T ( " Texture Replacement " ) ) ) ;
list - > Add ( new CheckBox ( & g_Config . bSaveNewTextures , dev - > T ( " Save new textures " ) ) ) ;
list - > Add ( new CheckBox ( & g_Config . bReplaceTextures , dev - > T ( " Replace textures " ) ) ) ;
2018-12-16 20:48:35 +00:00
2020-12-15 23:06:39 +00:00
// Makes it easy to get savestates out of an iOS device. The file listing shown in MacOS doesn't allow
// you to descend into directories.
# if PPSSPP_PLATFORM(IOS)
list - > Add ( new Choice ( dev - > T ( " Copy savestates to memstick root " ) ) ) - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnCopyStatesToRoot ) ;
# endif
2016-06-21 22:33:06 +00:00
# if !defined(MOBILE_DEVICE)
2017-06-03 15:52:42 +00:00
Choice * createTextureIni = list - > Add ( new Choice ( dev - > T ( " Create/Open textures.ini file for current game " ) ) ) ;
createTextureIni - > OnClick . Handle ( this , & DeveloperToolsScreen : : OnOpenTexturesIniFile ) ;
if ( ! PSP_IsInited ( ) ) {
createTextureIni - > SetEnabled ( false ) ;
}
2016-06-21 22:33:06 +00:00
# endif
2013-07-18 09:39:54 +00:00
}
2013-10-25 11:19:08 +00:00
void DeveloperToolsScreen : : onFinish ( DialogResult result ) {
2019-02-23 09:49:49 +00:00
g_Config . Save ( " DeveloperToolsScreen::onFinish " ) ;
2013-07-18 09:39:54 +00:00
}
2013-09-28 06:21:59 +00:00
void GameSettingsScreen : : CallbackRestoreDefaults ( bool yes ) {
2013-10-25 11:19:08 +00:00
if ( yes )
2013-08-28 20:23:16 +00:00
g_Config . RestoreDefaults ( ) ;
2013-09-29 02:41:47 +00:00
host - > UpdateUI ( ) ;
2013-08-28 20:23:16 +00:00
}
2013-09-28 06:21:59 +00:00
UI : : EventReturn GameSettingsScreen : : OnRestoreDefaultSettings ( UI : : EventParams & e ) {
2020-01-26 18:43:18 +00:00
auto dev = GetI18NCategory ( " Developer " ) ;
auto di = GetI18NCategory ( " Dialog " ) ;
2014-12-19 16:03:42 +00:00
if ( g_Config . bGameSpecific )
{
screenManager ( ) - > push (
2015-07-01 21:26:55 +00:00
new PromptScreen ( dev - > T ( " RestoreGameDefaultSettings " , " Are you sure you want to restore the game-specific settings back to the ppsspp defaults? \n " ) , di - > T ( " OK " ) , di - > T ( " Cancel " ) ,
2016-10-12 09:32:24 +00:00
std : : bind ( & GameSettingsScreen : : CallbackRestoreDefaults , this , std : : placeholders : : _1 ) ) ) ;
2014-12-19 16:03:42 +00:00
}
else
{
screenManager ( ) - > push (
2015-07-01 21:26:55 +00:00
new PromptScreen ( dev - > T ( " RestoreDefaultSettings " , " Are you sure you want to restore all settings(except control mapping) \n back to their defaults? \n You can't undo this. \n Please restart PPSSPP after restoring settings. " ) , di - > T ( " OK " ) , di - > T ( " Cancel " ) ,
2016-10-12 09:32:24 +00:00
std : : bind ( & GameSettingsScreen : : CallbackRestoreDefaults , this , std : : placeholders : : _1 ) ) ) ;
2014-12-19 16:03:42 +00:00
}
2013-08-28 20:23:16 +00:00
return UI : : EVENT_DONE ;
}
2013-08-17 23:24:34 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnLoggingChanged ( UI : : EventParams & e ) {
2013-10-13 18:25:59 +00:00
host - > ToggleDebugConsoleVisibility ( ) ;
2013-08-17 23:24:34 +00:00
return UI : : EVENT_DONE ;
}
2013-07-18 09:39:54 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnRunCPUTests ( UI : : EventParams & e ) {
2017-02-24 23:25:46 +00:00
# if !PPSSPP_PLATFORM(UWP)
2013-07-18 09:39:54 +00:00
RunTests ( ) ;
2017-02-24 23:25:46 +00:00
# endif
2013-07-18 09:39:54 +00:00
return UI : : EVENT_DONE ;
}
2013-07-20 10:06:06 +00:00
2013-08-18 17:51:40 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnSaveLanguageIni ( UI : : EventParams & e ) {
2013-09-16 23:47:25 +00:00
i18nrepo . SaveIni ( g_Config . sLanguageIni ) ;
2013-08-18 17:51:40 +00:00
return UI : : EVENT_DONE ;
}
UI : : EventReturn DeveloperToolsScreen : : OnLoadLanguageIni ( UI : : EventParams & e ) {
2013-09-16 23:47:25 +00:00
i18nrepo . LoadIni ( g_Config . sLanguageIni ) ;
2013-07-20 10:06:06 +00:00
return UI : : EVENT_DONE ;
}
2013-09-07 11:38:37 +00:00
2016-06-21 22:33:06 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnOpenTexturesIniFile ( UI : : EventParams & e ) {
2017-06-03 03:54:28 +00:00
std : : string gameID = g_paramSFO . GetDiscID ( ) ;
2021-05-05 23:31:38 +00:00
Path generatedFilename ;
2021-05-11 07:50:28 +00:00
if ( TextureReplacer : : GenerateIni ( gameID , generatedFilename ) ) {
2021-05-09 13:02:46 +00:00
File : : OpenFileInEditor ( generatedFilename ) ;
2016-06-21 22:33:06 +00:00
}
return UI : : EVENT_DONE ;
}
2013-09-07 11:38:37 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnLogConfig ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new LogConfigScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2014-05-27 06:55:48 +00:00
2019-02-04 12:00:08 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnJitDebugTools ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new JitDebugScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2018-12-16 20:48:35 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnGPUDriverTest ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new GPUDriverTestScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2021-01-31 12:13:42 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnFramedumpTest ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new FrameDumpTestScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2019-10-02 20:03:02 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnTouchscreenTest ( UI : : EventParams & e ) {
screenManager ( ) - > push ( new TouchTestScreen ( ) ) ;
return UI : : EVENT_DONE ;
}
2014-05-27 06:55:48 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnJitAffectingSetting ( UI : : EventParams & e ) {
NativeMessageReceived ( " clear jit " , " " ) ;
return UI : : EVENT_DONE ;
}
2014-06-02 06:15:07 +00:00
2020-12-15 23:06:39 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnCopyStatesToRoot ( UI : : EventParams & e ) {
2021-05-05 23:31:38 +00:00
Path savestate_dir = GetSysDirectory ( DIRECTORY_SAVESTATE ) ;
Path root_dir = GetSysDirectory ( DIRECTORY_MEMSTICK_ROOT ) ;
2020-12-15 23:06:39 +00:00
2021-04-25 18:38:22 +00:00
std : : vector < File : : FileInfo > files ;
2021-05-05 23:31:38 +00:00
GetFilesInDir ( savestate_dir , & files , nullptr , 0 ) ;
2020-12-15 23:06:39 +00:00
2021-04-25 18:38:22 +00:00
for ( const File : : FileInfo & file : files ) {
2021-05-15 05:48:04 +00:00
Path src = file . fullName ;
2021-05-09 13:02:46 +00:00
Path dst = root_dir / file . name ;
2020-12-15 23:06:39 +00:00
INFO_LOG ( SYSTEM , " Copying file '%s' to '%s' " , src . c_str ( ) , dst . c_str ( ) ) ;
File : : Copy ( src , dst ) ;
}
return UI : : EVENT_DONE ;
}
2018-04-21 21:17:33 +00:00
UI : : EventReturn DeveloperToolsScreen : : OnRemoteDebugger ( UI : : EventParams & e ) {
if ( allowDebugger_ ) {
StartWebServer ( WebServerFlags : : DEBUGGER ) ;
} else {
StopWebServer ( WebServerFlags : : DEBUGGER ) ;
}
// Persist the setting. Maybe should separate?
g_Config . bRemoteDebuggerOnStartup = allowDebugger_ ;
return UI : : EVENT_CONTINUE ;
}
void DeveloperToolsScreen : : update ( ) {
UIDialogScreenWithBackground : : update ( ) ;
allowDebugger_ = ! WebServerStopped ( WebServerFlags : : DEBUGGER ) ;
canAllowDebugger_ = ! WebServerStopping ( WebServerFlags : : DEBUGGER ) ;
}
2019-08-18 00:14:31 +00:00
void HostnameSelectScreen : : CreatePopupContents ( UI : : ViewGroup * parent ) {
2016-08-27 18:38:05 +00:00
using namespace UI ;
2020-01-26 18:43:18 +00:00
auto sy = GetI18NCategory ( " System " ) ;
auto di = GetI18NCategory ( " Dialog " ) ;
auto n = GetI18NCategory ( " Networking " ) ;
2016-08-27 18:38:05 +00:00
2019-08-18 00:14:31 +00:00
LinearLayout * valueRow = new LinearLayout ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , FILL_PARENT , Margins ( 0 , 0 , 0 , 10 ) ) ) ;
2014-06-02 06:15:07 +00:00
2021-02-22 00:38:02 +00:00
addrView_ = new TextEdit ( * value_ , n - > T ( " Hostname " ) , " " ) ;
2019-08-18 00:38:29 +00:00
addrView_ - > SetTextAlign ( FLAG_DYNAMIC_ASCII ) ;
2019-08-18 00:14:31 +00:00
valueRow - > Add ( addrView_ ) ;
parent - > Add ( valueRow ) ;
2014-06-02 06:15:07 +00:00
2019-08-18 00:14:31 +00:00
LinearLayout * buttonsRow1 = new LinearLayout ( ORIENT_HORIZONTAL , new LinearLayoutParams ( FILL_PARENT , WRAP_CONTENT ) ) ;
LinearLayout * buttonsRow2 = new LinearLayout ( ORIENT_HORIZONTAL , new LinearLayoutParams ( FILL_PARENT , WRAP_CONTENT ) ) ;
parent - > Add ( buttonsRow1 ) ;
parent - > Add ( buttonsRow2 ) ;
2014-06-02 06:15:07 +00:00
2019-08-18 00:38:29 +00:00
buttonsRow1 - > Add ( new Spacer ( new LinearLayoutParams ( 1.0 , G_LEFT ) ) ) ;
2019-08-18 00:14:31 +00:00
for ( char c = ' 0 ' ; c < = ' 9 ' ; + + c ) {
char label [ ] = { c , ' \0 ' } ;
auto button = buttonsRow1 - > Add ( new Button ( label ) ) ;
button - > OnClick . Handle ( this , & HostnameSelectScreen : : OnNumberClick ) ;
button - > SetTag ( label ) ;
}
buttonsRow1 - > Add ( new Button ( " . " ) ) - > OnClick . Handle ( this , & HostnameSelectScreen : : OnPointClick ) ;
2019-08-18 00:38:29 +00:00
buttonsRow1 - > Add ( new Spacer ( new LinearLayoutParams ( 1.0 , G_RIGHT ) ) ) ;
2014-06-02 06:15:07 +00:00
2019-08-18 00:38:29 +00:00
buttonsRow2 - > Add ( new Spacer ( new LinearLayoutParams ( 1.0 , G_LEFT ) ) ) ;
2020-07-17 01:54:37 +00:00
# if defined(__ANDROID__)
buttonsRow2 - > Add ( new Button ( di - > T ( " Edit " ) ) ) - > OnClick . Handle ( this , & HostnameSelectScreen : : OnEditClick ) ; // Since we don't have OnClick Event triggered from TextEdit's Touch().. here we go!
# endif
2019-08-18 00:14:31 +00:00
buttonsRow2 - > Add ( new Button ( di - > T ( " Delete " ) ) ) - > OnClick . Handle ( this , & HostnameSelectScreen : : OnDeleteClick ) ;
buttonsRow2 - > Add ( new Button ( di - > T ( " Delete all " ) ) ) - > OnClick . Handle ( this , & HostnameSelectScreen : : OnDeleteAllClick ) ;
2020-07-17 01:54:37 +00:00
buttonsRow2 - > Add ( new Button ( di - > T ( " Toggle List " ) ) ) - > OnClick . Handle ( this , & HostnameSelectScreen : : OnShowIPListClick ) ;
2019-08-18 00:38:29 +00:00
buttonsRow2 - > Add ( new Spacer ( new LinearLayoutParams ( 1.0 , G_RIGHT ) ) ) ;
2019-08-18 01:24:57 +00:00
2020-10-07 19:43:07 +00:00
std : : vector < std : : string > listIP = { " myneighborsushicat.com " , " socom.cc " , " localhost " } ; // TODO: Add some saved recent history too?
2020-07-17 01:54:37 +00:00
net : : GetIPList ( listIP ) ;
ipRows_ = new LinearLayout ( ORIENT_VERTICAL , new LinearLayoutParams ( 1.0 ) ) ;
ScrollView * scrollView = new ScrollView ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , WRAP_CONTENT ) ) ;
LinearLayout * innerView = new LinearLayout ( ORIENT_VERTICAL , new LinearLayoutParams ( FILL_PARENT , WRAP_CONTENT ) ) ;
if ( listIP . size ( ) > 0 ) {
for ( const auto & label : listIP ) {
// Filter out IP prefixed with "127." and "169.254." also "0." since they can be rendundant or unusable
if ( label . find ( " 127. " ) ! = 0 & & label . find ( " 169.254. " ) ! = 0 & & label . find ( " 0. " ) ! = 0 ) {
auto button = innerView - > Add ( new Button ( label , new LinearLayoutParams ( FILL_PARENT , WRAP_CONTENT ) ) ) ;
button - > OnClick . Handle ( this , & HostnameSelectScreen : : OnIPClick ) ;
button - > SetTag ( label ) ;
}
}
}
scrollView - > Add ( innerView ) ;
ipRows_ - > Add ( scrollView ) ;
ipRows_ - > SetVisibility ( V_GONE ) ;
parent - > Add ( ipRows_ ) ;
listIP . clear ( ) ; listIP . shrink_to_fit ( ) ;
2019-08-18 01:24:57 +00:00
errorView_ = parent - > Add ( new TextView ( n - > T ( " Invalid IP or hostname " ) , ALIGN_HCENTER , false , new LinearLayoutParams ( Margins ( 0 , 10 , 0 , 0 ) ) ) ) ;
errorView_ - > SetTextColor ( 0xFF3030FF ) ;
errorView_ - > SetVisibility ( V_GONE ) ;
progressView_ = parent - > Add ( new TextView ( n - > T ( " Validating address... " ) , ALIGN_HCENTER , false , new LinearLayoutParams ( Margins ( 0 , 10 , 0 , 0 ) ) ) ) ;
progressView_ - > SetVisibility ( V_GONE ) ;
2019-08-18 00:38:29 +00:00
}
void HostnameSelectScreen : : SendEditKey ( int keyCode , int flags ) {
auto oldView = UI : : GetFocusedView ( ) ;
UI : : SetFocusedView ( addrView_ ) ;
KeyInput fakeKey { DEVICE_ID_KEYBOARD , keyCode , KEY_DOWN | flags } ;
addrView_ - > Key ( fakeKey ) ;
UI : : SetFocusedView ( oldView ) ;
2014-06-02 06:15:07 +00:00
}
2019-08-18 00:14:31 +00:00
UI : : EventReturn HostnameSelectScreen : : OnNumberClick ( UI : : EventParams & e ) {
std : : string text = e . v ? e . v - > Tag ( ) : " " ;
2019-08-18 00:38:29 +00:00
if ( text . length ( ) = = 1 & & text [ 0 ] > = ' 0 ' & & text [ 0 ] < = ' 9 ' ) {
SendEditKey ( text [ 0 ] , KEY_CHAR ) ;
}
2014-06-02 06:15:07 +00:00
return UI : : EVENT_DONE ;
}
2019-08-17 23:42:19 +00:00
UI : : EventReturn HostnameSelectScreen : : OnPointClick ( UI : : EventParams & e ) {
2019-08-18 00:38:29 +00:00
SendEditKey ( ' . ' , KEY_CHAR ) ;
2014-06-02 06:15:07 +00:00
return UI : : EVENT_DONE ;
}
2019-08-17 23:42:19 +00:00
UI : : EventReturn HostnameSelectScreen : : OnDeleteClick ( UI : : EventParams & e ) {
2019-08-18 00:38:29 +00:00
SendEditKey ( NKCODE_DEL ) ;
2014-06-02 06:15:07 +00:00
return UI : : EVENT_DONE ;
}
2019-08-17 23:42:19 +00:00
UI : : EventReturn HostnameSelectScreen : : OnDeleteAllClick ( UI : : EventParams & e ) {
2019-08-18 00:38:29 +00:00
addrView_ - > SetText ( " " ) ;
2014-06-02 06:15:07 +00:00
return UI : : EVENT_DONE ;
}
2020-07-17 01:54:37 +00:00
UI : : EventReturn HostnameSelectScreen : : OnEditClick ( UI : : EventParams & e ) {
auto n = GetI18NCategory ( " Networking " ) ;
# if defined(__ANDROID__)
System_InputBoxGetString ( n - > T ( " proAdhocServer Address: " ) , addrView_ - > GetText ( ) , [ this ] ( bool result , const std : : string & value ) {
if ( result ) {
addrView_ - > SetText ( value ) ;
}
} ) ;
# endif
return UI : : EVENT_DONE ;
}
UI : : EventReturn HostnameSelectScreen : : OnShowIPListClick ( UI : : EventParams & e ) {
if ( ipRows_ - > GetVisibility ( ) = = UI : : V_GONE ) {
ipRows_ - > SetVisibility ( UI : : V_VISIBLE ) ;
}
else {
ipRows_ - > SetVisibility ( UI : : V_GONE ) ;
}
return UI : : EVENT_DONE ;
}
UI : : EventReturn HostnameSelectScreen : : OnIPClick ( UI : : EventParams & e ) {
std : : string text = e . v ? e . v - > Tag ( ) : " " ;
if ( text . length ( ) > 0 ) {
addrView_ - > SetText ( text ) ;
// TODO: Copy the IP to clipboard for the host to easily share their IP through chatting apps.
System_SendMessage ( " setclipboardtext " , text . c_str ( ) ) ; // Doesn't seems to be working on windows (yet?)
}
return UI : : EVENT_DONE ;
}
2019-08-18 01:24:57 +00:00
void HostnameSelectScreen : : ResolverThread ( ) {
std : : unique_lock < std : : mutex > guard ( resolverLock_ ) ;
while ( resolverState_ ! = ResolverState : : QUIT ) {
resolverCond_ . wait ( guard ) ;
if ( resolverState_ = = ResolverState : : QUEUED ) {
resolverState_ = ResolverState : : PROGRESS ;
addrinfo * resolved = nullptr ;
std : : string err ;
toResolveResult_ = net : : DNSResolve ( toResolve_ , " 80 " , & resolved , err ) ;
if ( resolved )
net : : DNSResolveFree ( resolved ) ;
resolverState_ = ResolverState : : READY ;
}
}
}
bool HostnameSelectScreen : : CanComplete ( DialogResult result ) {
if ( result ! = DR_OK )
return true ;
std : : string value = addrView_ - > GetText ( ) ;
if ( lastResolved_ = = value ) {
return true ;
}
// Currently running.
if ( resolverState_ = = ResolverState : : PROGRESS )
return false ;
std : : lock_guard < std : : mutex > guard ( resolverLock_ ) ;
switch ( resolverState_ ) {
case ResolverState : : PROGRESS :
case ResolverState : : QUIT :
return false ;
case ResolverState : : QUEUED :
case ResolverState : : WAITING :
break ;
case ResolverState : : READY :
if ( toResolve_ = = value ) {
// Reset the state, nothing there now.
resolverState_ = ResolverState : : WAITING ;
toResolve_ . clear ( ) ;
lastResolved_ = value ;
lastResolvedResult_ = toResolveResult_ ;
if ( lastResolvedResult_ ) {
errorView_ - > SetVisibility ( UI : : V_GONE ) ;
} else {
errorView_ - > SetVisibility ( UI : : V_VISIBLE ) ;
}
progressView_ - > SetVisibility ( UI : : V_GONE ) ;
return true ;
}
// Throw away that last result, it was for a different value.
break ;
}
resolverState_ = ResolverState : : QUEUED ;
toResolve_ = value ;
resolverCond_ . notify_one ( ) ;
progressView_ - > SetVisibility ( UI : : V_VISIBLE ) ;
errorView_ - > SetVisibility ( UI : : V_GONE ) ;
return false ;
}
2019-08-18 00:14:31 +00:00
void HostnameSelectScreen : : OnCompleted ( DialogResult result ) {
if ( result = = DR_OK )
2020-08-19 05:33:20 +00:00
* value_ = StripSpaces ( addrView_ - > GetText ( ) ) ;
2014-06-02 06:15:07 +00:00
}
2016-08-14 21:27:36 +00:00
2017-06-03 16:38:37 +00:00
SettingInfoMessage : : SettingInfoMessage ( int align , UI : : AnchorLayoutParams * lp )
: UI : : LinearLayout ( UI : : ORIENT_HORIZONTAL , lp ) {
using namespace UI ;
SetSpacing ( 0.0f ) ;
Add ( new UI : : Spacer ( 10.0f ) ) ;
text_ = Add ( new UI : : TextView ( " " , align , false , new LinearLayoutParams ( 1.0 , Margins ( 0 , 10 ) ) ) ) ;
Add ( new UI : : Spacer ( 10.0f ) ) ;
}
2016-08-14 21:27:36 +00:00
void SettingInfoMessage : : Show ( const std : : string & text , UI : : View * refView ) {
if ( refView ) {
Bounds b = refView - > GetBounds ( ) ;
const UI : : AnchorLayoutParams * lp = GetLayoutParams ( ) - > As < UI : : AnchorLayoutParams > ( ) ;
if ( b . y > = cutOffY_ ) {
ReplaceLayoutParams ( new UI : : AnchorLayoutParams ( lp - > width , lp - > height , lp - > left , 80.0f , lp - > right , lp - > bottom , lp - > center ) ) ;
} else {
ReplaceLayoutParams ( new UI : : AnchorLayoutParams ( lp - > width , lp - > height , lp - > left , dp_yres - 80.0f - 40.0f , lp - > right , lp - > bottom , lp - > center ) ) ;
}
}
2017-06-03 16:38:37 +00:00
text_ - > SetText ( text ) ;
2016-08-14 21:27:36 +00:00
timeShown_ = time_now_d ( ) ;
}
void SettingInfoMessage : : Draw ( UIContext & dc ) {
static const double FADE_TIME = 1.0 ;
static const float MAX_ALPHA = 0.9f ;
// Let's show longer messages for more time (guesstimate at reading speed.)
// Note: this will give multibyte characters more time, but they often have shorter words anyway.
2017-06-03 16:38:37 +00:00
double timeToShow = std : : max ( 1.5 , text_ - > GetText ( ) . size ( ) * 0.05 ) ;
2016-08-14 21:27:36 +00:00
double sinceShow = time_now_d ( ) - timeShown_ ;
float alpha = MAX_ALPHA ;
if ( timeShown_ = = 0.0 | | sinceShow > timeToShow + FADE_TIME ) {
alpha = 0.0f ;
} else if ( sinceShow > timeToShow ) {
alpha = MAX_ALPHA - MAX_ALPHA * ( float ) ( ( sinceShow - timeToShow ) / FADE_TIME ) ;
}
if ( alpha > = 0.1f ) {
UI : : Style style = dc . theme - > popupTitle ;
style . background . color = colorAlpha ( style . background . color , alpha - 0.1f ) ;
dc . FillRect ( style . background , bounds_ ) ;
}
2017-06-03 16:38:37 +00:00
text_ - > SetTextColor ( whiteAlpha ( alpha ) ) ;
ViewGroup : : Draw ( dc ) ;
2016-08-14 21:27:36 +00:00
}