diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2012-05-16 09:27:37 +0200 |
|---|---|---|
| committer | Pierre Bourdon <delroth@gmail.com> | 2012-05-16 09:27:37 +0200 |
| commit | fdff4cb1ffa76e894dd41ca5f97d31f122fd3f86 (patch) | |
| tree | 20059e8c98923d27f235c9f12de31be97e20240f /Source/Core/DolphinWX | |
| parent | 2b77acc705eae11fdb4a25be6d6ea5db1fa52e21 (diff) | |
| parent | 5a8ad9230271a5088b0cf582932959214c6b5527 (diff) | |
Merge branch 'master' into wii-network
Conflicts:
Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp
Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp
Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_es.cpp
Source/VSProps/Dolphin.Win32.props
Source/VSProps/Dolphin.x64.props
Diffstat (limited to 'Source/Core/DolphinWX')
26 files changed, 835 insertions, 426 deletions
diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index 2d7ed7e0ce..03f947b341 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -63,8 +63,7 @@ if(wxWidgets_FOUND) Src/WiimoteConfigDiag.cpp Src/WxUtils.cpp) - set(WXLIBS ${wxWidgets_LIBRARIES} - ${GTK2_LIBRARIES}) + set(WXLIBS ${wxWidgets_LIBRARIES}) else() set(SRCS Src/MainNoGUI.cpp) endif() diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj index 942bd41f4e..72c40a3db4 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ b/Source/Core/DolphinWX/Dolphin.vcxproj @@ -130,7 +130,7 @@ </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link /> <PostBuildEvent> @@ -144,7 +144,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> - <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link /> <PostBuildEvent> @@ -158,7 +158,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <OpenMPSupport> </OpenMPSupport> </ClCompile> @@ -174,7 +174,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link /> <PostBuildEvent> @@ -188,7 +188,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> - <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <OpenMPSupport> </OpenMPSupport> </ClCompile> @@ -204,7 +204,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|x64'"> <ClCompile> - <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link /> <PostBuildEvent> @@ -330,30 +330,23 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / <ItemGroup> <None Include="..\..\..\Installer\Dolphin.ico" /> <None Include="CMakeLists.txt" /> - <None Include="Src\SConscript" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\..\..\Externals\Bochs_disasm\Bochs_disasm.vcxproj"> <Project>{cd3d4c3c-1027-4d33-b047-aec7b56d0bf6}</Project> </ProjectReference> + <ProjectReference Include="..\..\..\Externals\libpng\png\png.vcxproj"> + <Project>{01573c36-ac6e-49f6-94ba-572517eb9740}</Project> + </ProjectReference> <ProjectReference Include="..\..\..\Externals\LZO\LZO.vcxproj"> <Project>{d8890b98-26f7-4cff-bbfb-b95f371b5f20}</Project> </ProjectReference> <ProjectReference Include="..\..\..\Externals\SFML\build\vc2010\SFML_Network.vcxproj"> <Project>{93d73454-2512-424e-9cda-4bb357fe13dd}</Project> </ProjectReference> - <ProjectReference Include="..\..\..\Externals\wxWidgets\build\msw\wx_adv.vcxproj"> - <Project>{0e231fb1-f3c9-4724-accb-de8bcb3c089e}</Project> - </ProjectReference> - <ProjectReference Include="..\..\..\Externals\wxWidgets\build\msw\wx_aui.vcxproj"> - <Project>{05c75041-d67d-4903-a362-8395a7b35c75}</Project> - </ProjectReference> - <ProjectReference Include="..\..\..\Externals\wxWidgets\build\msw\wx_base.vcxproj"> + <ProjectReference Include="..\..\..\Externals\wxWidgets3\build\msw\wx_base.vcxproj"> <Project>{1c8436c9-dbaf-42be-83bc-cf3ec9175abe}</Project> </ProjectReference> - <ProjectReference Include="..\..\..\Externals\wxWidgets\build\msw\wx_core.vcxproj"> - <Project>{11f55366-12ec-4c44-a8cb-1d4e315d61ed}</Project> - </ProjectReference> <ProjectReference Include="..\..\..\Externals\zlib\zlib.vcxproj"> <Project>{3e1339f5-9311-4122-9442-369702e8fcad}</Project> </ProjectReference> diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj.filters b/Source/Core/DolphinWX/Dolphin.vcxproj.filters index ec7d68798b..61ae0826fc 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj.filters +++ b/Source/Core/DolphinWX/Dolphin.vcxproj.filters @@ -266,7 +266,6 @@ </ClInclude> </ItemGroup> <ItemGroup> - <None Include="Src\SConscript" /> <None Include="CMakeLists.txt" /> <None Include="..\..\..\Installer\Dolphin.ico"> <Filter>Resources</Filter> diff --git a/Source/Core/DolphinWX/SConscript b/Source/Core/DolphinWX/SConscript deleted file mode 100644 index 92ca4f9f62..0000000000 --- a/Source/Core/DolphinWX/SConscript +++ /dev/null @@ -1,138 +0,0 @@ -# -*- python -*- - -Import('env') -import os -import sys - -if env['nowx']: - files = ['Src/MainNoGUI.cpp'] -else: - files = [ - 'Src/ARCodeAddEdit.cpp', - 'Src/AboutDolphin.cpp', - 'Src/CheatsWindow.cpp', - 'Src/ConfigMain.cpp', - 'Src/Debugger/BreakpointDlg.cpp', - 'Src/Debugger/BreakpointView.cpp', - 'Src/Debugger/BreakpointWindow.cpp', - 'Src/Debugger/CodeView.cpp', - 'Src/Debugger/CodeWindow.cpp', - 'Src/Debugger/CodeWindowFunctions.cpp', - 'Src/Debugger/DSPDebugWindow.cpp', - 'Src/Debugger/DSPRegisterView.cpp', - 'Src/Debugger/DebuggerPanel.cpp', - 'Src/Debugger/DebuggerUIUtil.cpp', - 'Src/Debugger/JitWindow.cpp', - 'Src/Debugger/MemoryCheckDlg.cpp', - 'Src/Debugger/MemoryView.cpp', - 'Src/Debugger/MemoryWindow.cpp', - 'Src/Debugger/RegisterView.cpp', - 'Src/Debugger/RegisterWindow.cpp', - 'Src/FifoPlayerDlg.cpp', - 'Src/Frame.cpp', - 'Src/FrameAui.cpp', - 'Src/FrameTools.cpp', - 'Src/GameListCtrl.cpp', - 'Src/GeckoCodeDiag.cpp', - 'Src/HotkeyDlg.cpp', - 'Src/ISOFile.cpp', - 'Src/ISOProperties.cpp', - 'Src/InputConfigDiag.cpp', - 'Src/InputConfigDiagBitmaps.cpp', - 'Src/LogConfigWindow.cpp', - 'Src/LogWindow.cpp', - 'Src/Main.cpp', - 'Src/MemcardManager.cpp', - 'Src/MemoryCards/WiiSaveCrypted.cpp', - 'Src/NetWindow.cpp', - 'Src/PHackSettings.cpp', - 'Src/PatchAddEdit.cpp', - 'Src/TASInputDlg.cpp', - 'Src/UDPConfigDiag.cpp', - 'Src/VideoConfigDiag.cpp', - 'Src/WXInputBase.cpp', - 'Src/WiimoteConfigDiag.cpp', - 'Src/WxUtils.cpp', - ] - -if sys.platform == 'win32': - files += ['Src/stdafx.cpp'] -elif sys.platform == 'darwin': - env['CPPPATH'] += ['#Externals'] - env['FRAMEWORKPATH'] += ['Externals/Cg'] - env['FRAMEWORKS'] += ['ApplicationServices', 'Carbon', 'Cocoa'] - env['FRAMEWORKS'] += ['AudioUnit', 'IOBluetooth', 'IOKit', 'OpenGL'] - env['FRAMEWORKSFLAGS'] = ['-Wl,-lazy_framework,Cg'] - env['FRAMEWORKSFLAGS'] += ['-Wl,-weak_framework,OpenCL'] - env['LIBS'] += ['iconv', 'z'] - - # XXX - env['FRAMEWORKSFLAGS'] += ['-Wl,-weak_framework,QuickTime'] - env['FRAMEWORKSFLAGS'] += ['-Wl,-no_arch_warnings'] - - exe = '#' + env['prefix'] + '/Dolphin.app/Contents/MacOS/Dolphin' - if env['nowx']: - exe += 'NoGUI' - - env.Install('#' + env['prefix'] + '/Dolphin.app/Contents/' + - 'Frameworks/Cg.framework', source = [ - '#Externals/Cg/Cg.framework/Cg', - '#Externals/Cg/Cg.framework/Resources' - ]) - - env.Install(env['data_dir'], '#Data/Sys') - env.Install(env['data_dir'], '#Data/User') - env.Install(env['data_dir'], - '#Source/Core/DolphinWX/resources/Dolphin.icns') - - languages = [] - msgfmt = env.WhereIs('msgfmt') - if not msgfmt == None: - po_files = Glob('#Languages/po/*.po', strings = True) - for po in po_files: - index_lo = po.find('Languages/po/') + len('Languages/po/') - index_hi = po.find('.po') - lang = po[index_lo:index_hi] - lproj = os.sep + lang + '.lproj' - mo_dir = env['build_dir'] + '/Languages' + lproj - mo_file = mo_dir + '/dolphin-emu.mo' - env.Command('#' + mo_file, po, 'mkdir -p ' + mo_dir + - ' && ' + msgfmt + ' -o ' + mo_file + ' ' + po) - env.Install(env['data_dir'] + lproj, '#' + mo_file) - languages += [lang] - - from plistlib import writePlist - def createPlist(target, source, env): - for srcNode in source: - writePlist(srcNode.value, str(target[0])) - env.Append(BUILDERS = {'Plist' : Builder(action = createPlist)}) - env.Plist('#' + env['prefix'] + '/Dolphin.app/Contents/Info.plist', - Value(dict( - CFBundleExecutable = 'Dolphin', - CFBundleIconFile = 'Dolphin.icns', - CFBundleIdentifier = 'com.dolphin-emulator.dolphin', - CFBundleLocalizations = languages, - CFBundlePackageType = 'APPL', - CFBundleShortVersionString = env['gitdesc'], - CFBundleVersion = '3.0', - LSMinimumSystemVersion = '10.5.4', - LSRequiresCarbon = True, - CFBundleDocumentTypes = [ - dict(CFBundleTypeExtensions = - ('ciso', 'dol', 'elf', 'gcm', 'gcz', 'iso', 'wad'), - CFBundleTypeIconFile = 'Dolphin.icns', - CFBundleTypeName = 'Nintendo GC/Wii file', - CFBundleTypeRole = 'Viewer')] - ))) - - env.Command('dummy', '#' + env['prefix'], - "find $SOURCES -name .svn -exec rm -rf {} +") -else: - files += ['Src/X11Utils.cpp'] - exe = env['binary_dir'] + '/dolphin-emu' - if env['nowx']: - exe += '-nogui' - env.InstallAs(env['data_dir'] + '/sys', '#Data/Sys') - env.InstallAs(env['data_dir'] + '/user', '#Data/User') - -env.Program(exe, files) diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index fdca309aee..2534c4a9db 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -90,7 +90,7 @@ static const wxLanguage langIds[] = #define EXIDEV_GECKO_STR "USBGecko" #define CSTR_TRANS(a) wxString(wxGetTranslation(wxT(a))).mb_str() - +#define WXSTR_TRANS(a) wxString(wxGetTranslation(wxT(a))) #ifdef WIN32 //only used with xgettext to be picked up as translatable string. //win32 does not have wx on its path, the provided wxALL_FILES @@ -116,7 +116,6 @@ EVT_CHECKBOX(ID_NTSCJ, CConfigMain::CoreSettingsChanged) EVT_RADIOBOX(ID_DSPENGINE, CConfigMain::AudioSettingsChanged) -EVT_CHECKBOX(ID_ENABLE_DTK_MUSIC, CConfigMain::AudioSettingsChanged) EVT_CHECKBOX(ID_DSPTHREAD, CConfigMain::AudioSettingsChanged) EVT_CHECKBOX(ID_ENABLE_THROTTLE, CConfigMain::AudioSettingsChanged) EVT_CHECKBOX(ID_DUMP_AUDIO, CConfigMain::AudioSettingsChanged) @@ -359,7 +358,6 @@ void CConfigMain::InitializeGUIValues() VolumeSlider->Enable(SupportsVolumeChanges(ac_Config.sBackend)); VolumeSlider->SetValue(ac_Config.m_Volume); VolumeText->SetLabel(wxString::Format(wxT("%d %%"), ac_Config.m_Volume)); - EnableDTKMusic->SetValue(ac_Config.m_EnableDTKMusic ? true : false); DSPThread->SetValue(startup_params.bDSPThread); DumpAudio->SetValue(ac_Config.m_DumpAudio ? true : false); FrequencySelection->SetSelection( @@ -502,7 +500,6 @@ void CConfigMain::InitializeGUITooltips() InterfaceLang->SetToolTip(_("Change the language of the user interface.\nRequires restart.")); // Audio tooltips - EnableDTKMusic->SetToolTip(_("This is used to play music tracks, like BGM.")); DSPThread->SetToolTip(_("Run DSP LLE on a dedicated thread (not recommended).")); FrequencySelection->SetToolTip(_("Changing this will have no effect while the emulator is running!")); BackendSelection->SetToolTip(_("Changing this will have no effect while the emulator is running!")); @@ -602,8 +599,6 @@ void CConfigMain::CreateGUIControls() // Audio page DSPEngine = new wxRadioBox(AudioPage, ID_DSPENGINE, _("DSP Emulator Engine"), wxDefaultPosition, wxDefaultSize, arrayStringFor_DSPEngine, 0, wxRA_SPECIFY_ROWS); - EnableDTKMusic = new wxCheckBox(AudioPage, ID_ENABLE_DTK_MUSIC, _("Enable DTK Music"), - wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); DSPThread = new wxCheckBox(AudioPage, ID_DSPTHREAD, _("DSP LLE on Thread")); DumpAudio = new wxCheckBox(AudioPage, ID_DUMP_AUDIO, _("Dump Audio"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -620,7 +615,6 @@ void CConfigMain::CreateGUIControls() // Create sizer and add items to dialog wxStaticBoxSizer *sbAudioSettings = new wxStaticBoxSizer(wxVERTICAL, AudioPage, _("Sound Settings")); sbAudioSettings->Add(DSPEngine, 0, wxALL | wxEXPAND, 5); - sbAudioSettings->Add(EnableDTKMusic, 0, wxALL, 5); sbAudioSettings->Add(DSPThread, 0, wxALL, 5); sbAudioSettings->Add(DumpAudio, 0, wxALL, 5); @@ -751,7 +745,7 @@ void CConfigMain::CreateGUIControls() RemoveISOPath->Enable(false); DefaultISO = new wxFilePickerCtrl(PathsPage, ID_DEFAULTISO, wxEmptyString, _("Choose a default ISO:"), - _("All GC/Wii images (gcm, iso, ciso, gcz)") + wxString::Format(wxT("|*.gcm;*.iso;*.ciso;*.gcz|%s"), wxGetTranslation(wxALL_FILES)), + _("All GC/Wii images (gcm, iso, wbfs, ciso, gcz)") + wxString::Format(wxT("|*.gcm;*.iso;*.wbfs;*.ciso;*.gcz|%s"), wxGetTranslation(wxALL_FILES)), wxDefaultPosition, wxDefaultSize, wxFLP_USE_TEXTCTRL|wxFLP_OPEN); DVDRoot = new wxDirPickerCtrl(PathsPage, ID_DVDROOT, wxEmptyString, _("Choose a DVD root directory:"), wxDefaultPosition, wxDefaultSize, wxDIRP_USE_TEXTCTRL); ApploaderPath = new wxFilePickerCtrl(PathsPage, ID_APPLOADERPATH, wxEmptyString, _("Choose file to use as apploader: (applies to discs constructed from directories only)"), @@ -918,7 +912,6 @@ void CConfigMain::AudioSettingsChanged(wxCommandEvent& event) break; default: - ac_Config.m_EnableDTKMusic = EnableDTKMusic->GetValue(); ac_Config.m_DumpAudio = DumpAudio->GetValue(); long int frequency; @@ -979,7 +972,7 @@ void CConfigMain::GCSettingsChanged(wxCommandEvent& event) case ID_GC_EXIDEVICE_SLOTB: exidevice++; case ID_GC_EXIDEVICE_SLOTA: - ChooseEXIDevice(std::string(event.GetString().mb_str()), exidevice); + ChooseEXIDevice(event.GetString(), exidevice); break; case ID_GC_EXIDEVICE_SLOTA_PATH: ChooseMemcardPath(SConfig::GetInstance().m_strMemoryCardA, true); @@ -994,7 +987,7 @@ void CConfigMain::GCSettingsChanged(wxCommandEvent& event) case ID_GC_SIDEVICE1: sidevice++; case ID_GC_SIDEVICE0: - ChooseSIDevice(std::string(event.GetString().mb_str()), sidevice); + ChooseSIDevice(event.GetString(), sidevice); break; } } @@ -1044,16 +1037,16 @@ void CConfigMain::ChooseMemcardPath(std::string& strMemcard, bool isSlotA) } } -void CConfigMain::ChooseSIDevice(std::string deviceName, int deviceNum) +void CConfigMain::ChooseSIDevice(wxString deviceName, int deviceNum) { SIDevices tempType; - if (!deviceName.compare(CSTR_TRANS(SIDEV_STDCONT_STR))) + if (!deviceName.compare(WXSTR_TRANS(SIDEV_STDCONT_STR))) tempType = SIDEVICE_GC_CONTROLLER; - else if (!deviceName.compare(CSTR_TRANS(SIDEV_BONGO_STR))) + else if (!deviceName.compare(WXSTR_TRANS(SIDEV_BONGO_STR))) tempType = SIDEVICE_GC_TARUKONGA; - else if (!deviceName.compare(SIDEV_GBA_STR)) + else if (!deviceName.compare(wxT(SIDEV_GBA_STR))) tempType = SIDEVICE_GC_GBA; - else if (!deviceName.compare(CSTR_TRANS(SIDEV_AM_BB_STR))) + else if (!deviceName.compare(WXSTR_TRANS(SIDEV_AM_BB_STR))) tempType = SIDEVICE_AM_BASEBOARD; else tempType = SIDEVICE_NONE; @@ -1067,21 +1060,21 @@ void CConfigMain::ChooseSIDevice(std::string deviceName, int deviceNum) } } -void CConfigMain::ChooseEXIDevice(std::string deviceName, int deviceNum) +void CConfigMain::ChooseEXIDevice(wxString deviceName, int deviceNum) { TEXIDevices tempType; - if (!deviceName.compare(CSTR_TRANS(EXIDEV_MEMCARD_STR))) + if (!deviceName.compare(WXSTR_TRANS(EXIDEV_MEMCARD_STR))) tempType = EXIDEVICE_MEMORYCARD; - else if (!deviceName.compare(CSTR_TRANS(EXIDEV_MIC_STR))) + else if (!deviceName.compare(WXSTR_TRANS(EXIDEV_MIC_STR))) tempType = EXIDEVICE_MIC; - else if (!deviceName.compare(EXIDEV_BBA_STR)) + else if (!deviceName.compare(wxT(EXIDEV_BBA_STR))) tempType = EXIDEVICE_ETH; - else if (!deviceName.compare(CSTR_TRANS(EXIDEV_AM_BB_STR))) + else if (!deviceName.compare(WXSTR_TRANS(EXIDEV_AM_BB_STR))) tempType = EXIDEVICE_AM_BASEBOARD; - else if (!deviceName.compare(EXIDEV_GECKO_STR)) + else if (!deviceName.compare(wxT(EXIDEV_GECKO_STR))) tempType = EXIDEVICE_GECKO; - else if (!deviceName.compare(CSTR_TRANS(DEV_NONE_STR))) + else if (!deviceName.compare(WXSTR_TRANS(DEV_NONE_STR))) tempType = EXIDEVICE_NONE; else tempType = EXIDEVICE_DUMMY; diff --git a/Source/Core/DolphinWX/Src/ConfigMain.h b/Source/Core/DolphinWX/Src/ConfigMain.h index 3ec798fb8e..eae9f8996d 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.h +++ b/Source/Core/DolphinWX/Src/ConfigMain.h @@ -77,7 +77,6 @@ private: // Audio Settings ID_DSPENGINE, ID_ENABLE_HLE_AUDIO, - ID_ENABLE_DTK_MUSIC, ID_ENABLE_THROTTLE, ID_DUMP_AUDIO, ID_FREQUENCY, @@ -156,7 +155,6 @@ private: wxRadioBox* DSPEngine; wxSlider* VolumeSlider; wxStaticText* VolumeText; - wxCheckBox* EnableDTKMusic; wxCheckBox* DumpAudio; wxArrayString wxArrayBackends; wxChoice* BackendSelection; @@ -253,8 +251,8 @@ private: void GCSettingsChanged(wxCommandEvent& event); void ChooseMemcardPath(std::string& strMemcard, bool isSlotA); - void ChooseSIDevice(std::string deviceName, int deviceNum); - void ChooseEXIDevice(std::string deviceName, int deviceNum); + void ChooseSIDevice(wxString deviceName, int deviceNum); + void ChooseEXIDevice(wxString deviceName, int deviceNum); void WiiSettingsChanged(wxCommandEvent& event); // Change from IPL.LNG value to country code diff --git a/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp b/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp index 37ff81772a..0b6b366c88 100644 --- a/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/CodeWindow.cpp @@ -263,6 +263,8 @@ void CCodeWindow::SingleStep() { if (CCPU::IsStepping()) { + if (jit) + jit->GetBlockCache()->InvalidateICache(PC, 4); CCPU::StepOpcode(&sync_event); wxThread::Sleep(20); // need a short wait here diff --git a/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp b/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp index a3dd9a9ab8..05915ecd20 100644 --- a/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp +++ b/Source/Core/DolphinWX/Src/Debugger/CodeWindowFunctions.cpp @@ -187,35 +187,40 @@ void CCodeWindow::CreateMenuSymbols(wxMenuBar *pMenuBar) void CCodeWindow::OnProfilerMenu(wxCommandEvent& event) { - if (Core::GetState() == Core::CORE_RUN) { - event.Skip(); - return; - } switch (event.GetId()) { case IDM_PROFILEBLOCKS: - if (jit != NULL) jit->ClearCache(); + Core::SetState(Core::CORE_PAUSE); + if (jit != NULL) + jit->ClearCache(); Profiler::g_ProfileBlocks = GetMenuBar()->IsChecked(IDM_PROFILEBLOCKS); + Core::SetState(Core::CORE_RUN); break; case IDM_WRITEPROFILE: - if (jit != NULL) - { - std::string filename = File::GetUserPath(D_DUMP_IDX) + "Debug/profiler.txt"; - File::CreateFullPath(filename); - Profiler::WriteProfileResults(filename.c_str()); + if (Core::GetState() == Core::CORE_RUN) + Core::SetState(Core::CORE_PAUSE); - wxFileType* filetype = NULL; - if (!(filetype = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("txt")))) + if (Core::GetState() == Core::CORE_PAUSE && PowerPC::GetMode() == PowerPC::MODE_JIT) + { + if (jit != NULL) { - // From extension failed, trying with MIME type now - if (!(filetype = wxTheMimeTypesManager->GetFileTypeFromMimeType(_T("text/plain")))) - // MIME type failed, aborting mission - break; + std::string filename = File::GetUserPath(D_DUMP_IDX) + "Debug/profiler.txt"; + File::CreateFullPath(filename); + Profiler::WriteProfileResults(filename.c_str()); + + wxFileType* filetype = NULL; + if (!(filetype = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("txt")))) + { + // From extension failed, trying with MIME type now + if (!(filetype = wxTheMimeTypesManager->GetFileTypeFromMimeType(_T("text/plain")))) + // MIME type failed, aborting mission + break; + } + wxString OpenCommand; + OpenCommand = filetype->GetOpenCommand(wxString::From8BitData(filename.c_str())); + if(!OpenCommand.IsEmpty()) + wxExecute(OpenCommand, wxEXEC_SYNC); } - wxString OpenCommand; - OpenCommand = filetype->GetOpenCommand(wxString::From8BitData(filename.c_str())); - if(!OpenCommand.IsEmpty()) - wxExecute(OpenCommand, wxEXEC_SYNC); } break; } diff --git a/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp b/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp index cd863095a1..cb467389ee 100644 --- a/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp +++ b/Source/Core/DolphinWX/Src/FifoPlayerDlg.cpp @@ -21,6 +21,7 @@ #include "Thread.h" #include "FifoPlayer/FifoPlayer.h" #include "FifoPlayer/FifoRecorder.h" +#include "OpcodeDecoding.h" #include <wx/spinctrl.h> DECLARE_EVENT_TYPE(RECORDING_FINISHED_EVENT, -1) @@ -36,7 +37,7 @@ wxEvtHandler *volatile FifoPlayerDlg::m_EvtHandler = NULL; FifoPlayerDlg::FifoPlayerDlg(wxWindow * const parent) : wxDialog(parent, wxID_ANY, _("FIFO Player"), wxDefaultPosition, wxDefaultSize), - m_FramesToRecord(1) + m_search_result_idx(0), m_FramesToRecord(1) { CreateGUIControls(); @@ -65,6 +66,10 @@ FifoPlayerDlg::~FifoPlayerDlg() m_FramesToRecordCtrl->Disconnect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler(FifoPlayerDlg::OnNumFramesToRecord), NULL, this); m_Close->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnCloseClick), NULL, this); + m_framesList->Disconnect(wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler(FifoPlayerDlg::OnFrameListSelectionChanged), NULL, this); + m_objectsList->Disconnect(wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler(FifoPlayerDlg::OnObjectListSelectionChanged), NULL, this); + m_objectCmdList->Disconnect(wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler(FifoPlayerDlg::OnObjectCmdListSelectionChanged), NULL, this); + FifoPlayer::GetInstance().SetFrameWrittenCallback(NULL); sMutex.lock(); @@ -74,12 +79,12 @@ FifoPlayerDlg::~FifoPlayerDlg() void FifoPlayerDlg::CreateGUIControls() { - SetSizeHints(wxDefaultSize, wxDefaultSize); - wxBoxSizer* sMain; sMain = new wxBoxSizer(wxVERTICAL); m_Notebook = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); + + { m_PlayPage = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer* sPlayPage; sPlayPage = new wxBoxSizer(wxVERTICAL); @@ -146,11 +151,15 @@ void FifoPlayerDlg::CreateGUIControls() sPlayOptions->Add(m_EarlyMemoryUpdates, 0, wxALL, 5); sPlayPage->Add(sPlayOptions, 0, wxEXPAND, 5); - + sPlayPage->AddStretchSpacer(); + m_PlayPage->SetSizer(sPlayPage); m_PlayPage->Layout(); sPlayPage->Fit(m_PlayPage); m_Notebook->AddPage(m_PlayPage, _("Play"), true); + } + + { m_RecordPage = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer* sRecordPage; sRecordPage = new wxBoxSizer(wxVERTICAL); @@ -194,33 +203,103 @@ void FifoPlayerDlg::CreateGUIControls() sRecordingOptions->Add(m_FramesToRecordCtrl, 0, wxALL, 5); sRecordPage->Add(sRecordingOptions, 0, wxEXPAND, 5); - + sRecordPage->AddStretchSpacer(); + m_RecordPage->SetSizer(sRecordPage); m_RecordPage->Layout(); sRecordPage->Fit(m_RecordPage); m_Notebook->AddPage(m_RecordPage, _("Record"), false); - + } + + // Analyze page + { + m_AnalyzePage = new wxPanel(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + wxBoxSizer* sAnalyzePage; + sAnalyzePage = new wxBoxSizer(wxVERTICAL); + + wxStaticBoxSizer* sFrameInfoSizer; + sFrameInfoSizer = new wxStaticBoxSizer(new wxStaticBox(m_AnalyzePage, wxID_ANY, _("Frame Info")), wxVERTICAL); + + wxBoxSizer* sListsSizer = new wxBoxSizer(wxHORIZONTAL); + + m_framesList = new wxListBox(m_AnalyzePage, wxID_ANY); + m_framesList->SetMinSize(wxSize(100, 250)); + sListsSizer->Add(m_framesList, 0, wxALL, 5); + + m_objectsList = new wxListBox(m_AnalyzePage, wxID_ANY); + m_objectsList->SetMinSize(wxSize(110, 250)); + sListsSizer->Add(m_objectsList, 0, wxALL, 5); + + m_objectCmdList = new wxListBox(m_AnalyzePage, wxID_ANY); + m_objectCmdList->SetMinSize(wxSize(175, 250)); + sListsSizer->Add(m_objectCmdList, 0, wxALL, 5); + + sFrameInfoSizer->Add(sListsSizer, 0, wxALL, 5); + + m_objectCmdInfo = new wxStaticText(m_AnalyzePage, wxID_ANY, wxString()); + sFrameInfoSizer->Add(m_objectCmdInfo, 0, wxALL, 5); + + sAnalyzePage->Add(sFrameInfoSizer, 0, wxEXPAND, 5); + + wxStaticBoxSizer* sSearchSizer = new wxStaticBoxSizer(new wxStaticBox(m_AnalyzePage, wxID_ANY, _("Search current Object")), wxVERTICAL); + + wxBoxSizer* sSearchField = new wxBoxSizer(wxHORIZONTAL); + + sSearchField->Add(new wxStaticText(m_AnalyzePage, wxID_ANY, _("Search for hex Value:")), 0, wxALIGN_CENTER_VERTICAL, 5); + // TODO: ugh, wxValidator sucks - but we should use it anyway. + m_searchField = new wxTextCtrl(m_AnalyzePage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); + m_numResultsText = new wxStaticText(m_AnalyzePage, wxID_ANY, wxEmptyString); + + sSearchField->Add(m_searchField, 0, wxALL, 5); + sSearchField->Add(m_numResultsText, 0, wxALIGN_CENTER_VERTICAL, 5); + + wxBoxSizer* sSearchButtons = new wxBoxSizer(wxHORIZONTAL); + + m_beginSearch = new wxButton(m_AnalyzePage, wxID_ANY, _("Search")); + m_findNext = new wxButton(m_AnalyzePage, wxID_ANY, _("Find next")); + m_findPrevious = new wxButton(m_AnalyzePage, wxID_ANY, _("Find previous")); + + m_beginSearch->Disable(); + m_findNext->Disable(); + m_findPrevious->Disable(); + + sSearchButtons->Add(m_beginSearch, 0, wxALL, 5); + sSearchButtons->Add(m_findNext, 0, wxALL, 5); + sSearchButtons->Add(m_findPrevious, 0, wxALL, 5); + + sSearchSizer->Add(sSearchField, 0, wxEXPAND, 5); + sSearchSizer->Add(sSearchButtons, 0, wxEXPAND, 5); + + sAnalyzePage->Add(sSearchSizer, 0, wxEXPAND, 5); + sAnalyzePage->AddStretchSpacer(); + + m_AnalyzePage->SetSizer(sAnalyzePage); + m_AnalyzePage->Layout(); + sAnalyzePage->Fit(m_AnalyzePage); + m_Notebook->AddPage(m_AnalyzePage, _("Analyze"), false); + } + sMain->Add(m_Notebook, 1, wxEXPAND | wxALL, 5); - + wxBoxSizer* sButtons; sButtons = new wxBoxSizer(wxHORIZONTAL); - + wxBoxSizer* sCloseButtonExpander; sCloseButtonExpander = new wxBoxSizer(wxHORIZONTAL); - + sButtons->Add(sCloseButtonExpander, 1, wxEXPAND, 5); - + m_Close = new wxButton(this, wxID_ANY, _("Close"), wxDefaultPosition, wxDefaultSize, 0); sButtons->Add(m_Close, 0, wxALL, 5); - + sMain->Add(sButtons, 0, wxEXPAND, 5); - + SetSizer(sMain); Layout(); sMain->Fit(this); - + Center(wxBOTH); - + // Connect Events Connect(wxEVT_PAINT, wxPaintEventHandler(FifoPlayerDlg::OnPaint)); m_FrameFromCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler(FifoPlayerDlg::OnFrameFrom), NULL, this); @@ -231,7 +310,18 @@ void FifoPlayerDlg::CreateGUIControls() m_RecordStop->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnRecordStop), NULL, this); m_Save->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnSaveFile), NULL, this); m_FramesToRecordCtrl->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler(FifoPlayerDlg::OnNumFramesToRecord), NULL, this); - m_Close->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnCloseClick), NULL, this); + Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnCloseClick), NULL, this); + + m_framesList->Connect(wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler(FifoPlayerDlg::OnFrameListSelectionChanged), NULL, this); + m_objectsList->Connect(wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler(FifoPlayerDlg::OnObjectListSelectionChanged), NULL, this); + m_objectCmdList->Connect(wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler(FifoPlayerDlg::OnObjectCmdListSelectionChanged), NULL, this); + + m_beginSearch->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnBeginSearch), NULL, this); + m_findNext->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnFindNextClick), NULL, this); + m_findPrevious->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FifoPlayerDlg::OnFindPreviousClick), NULL, this); + + m_searchField->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(FifoPlayerDlg::OnBeginSearch), NULL, this); + m_searchField->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(FifoPlayerDlg::OnSearchFieldTextChanged), NULL, this); Connect(RECORDING_FINISHED_EVENT, wxCommandEventHandler(FifoPlayerDlg::OnRecordingFinished), NULL, this); Connect(FRAME_WRITTEN_EVENT, wxCommandEventHandler(FifoPlayerDlg::OnFrameWritten), NULL, this); @@ -243,6 +333,7 @@ void FifoPlayerDlg::OnPaint(wxPaintEvent& event) { UpdatePlayGui(); UpdateRecorderGui(); + UpdateAnalyzerGui(); event.Skip(); } @@ -250,10 +341,11 @@ void FifoPlayerDlg::OnPaint(wxPaintEvent& event) void FifoPlayerDlg::OnFrameFrom(wxSpinEvent& event) { FifoPlayer &player = FifoPlayer::GetInstance(); + player.SetFrameRangeStart(event.GetPosition()); m_FrameFromCtrl->SetValue(player.GetFrameRangeStart()); - m_FrameToCtrl->SetValue(player.GetFrameRangeEnd()); + m_FrameToCtrl->SetValue(player.GetFrameRangeEnd()); } void FifoPlayerDlg::OnFrameTo(wxSpinEvent& event) @@ -326,6 +418,351 @@ void FifoPlayerDlg::OnNumFramesToRecord(wxSpinEvent& event) m_FramesToRecord = -1; } +void FifoPlayerDlg::OnBeginSearch(wxCommandEvent& event) +{ + wxString str_search_val = m_searchField->GetValue(); + + if (m_framesList->GetSelection() == -1) + return; + + // TODO: Limited to even str lengths... + if (str_search_val.Length() && str_search_val.Length() % 2) + { + m_numResultsText->SetLabel(_("Invalid search string (only even string lengths supported)")); + return; + } + + unsigned int val_length = str_search_val.Length() / 2; + u8* search_val = new u8[val_length]; + for (unsigned int i = 0; i < val_length; ++i) + { + wxString char_str = str_search_val.Mid(2*i, 2); + unsigned long val; + if (!char_str.ToULong(&val, 16)) + { + m_numResultsText->SetLabel(_("Invalid search string (couldn't convert to number)")); + delete[] search_val; + return; + } + search_val[i] = (u8)val; + } + search_results.clear(); + + u8* start_ptr; + u8* end_ptr; + + int frame_idx = m_framesList->GetSelection(); + FifoPlayer& player = FifoPlayer::GetInstance(); + const AnalyzedFrameInfo& frame = player.GetAnalyzedFrameInfo(frame_idx); + const FifoFrameInfo& fifo_frame = player.GetFile()->GetFrame(frame_idx); + + // TODO: Support searching through the last object... How do we know were the cmd data ends? + // TODO: Support searching for bit patterns + int obj_idx = m_objectsList->GetSelection(); + if (obj_idx == -1) + { + m_numResultsText->SetLabel(_("Invalid search parameters (no object selected)")); + return; + } + start_ptr = &fifo_frame.fifoData[frame.objectStarts[obj_idx]]; + end_ptr = &fifo_frame.fifoData[frame.objectStarts[obj_idx+1]]; + + for (u8* ptr = start_ptr; ptr < end_ptr-val_length+1; ++ptr) + { + if (memcmp(ptr, search_val, val_length) == 0) + { + SearchResult result; + result.frame_idx = frame_idx; + + int obj_idx = m_objectsList->GetSelection(); + result.obj_idx = obj_idx; + result.cmd_idx = 0; + for (unsigned int cmd_idx = 1; cmd_idx < m_objectCmdOffsets.size(); ++cmd_idx) + { + if (ptr < start_ptr + m_objectCmdOffsets[cmd_idx]) + { + result.cmd_idx = cmd_idx-1; + break; + } + } + search_results.push_back(result); + } + } + delete[] search_val; + + ChangeSearchResult(0); + m_beginSearch->Disable(); + m_findNext->Enable(); + m_findPrevious->Enable(); + m_numResultsText->SetLabel(wxString::Format(_("Found %d results for \'"), search_results.size()) + m_searchField->GetValue() + _("\'")); +} + +void FifoPlayerDlg::OnSearchFieldTextChanged(wxCommandEvent& event) +{ + m_beginSearch->Enable(m_searchField->GetLineLength(0) > 0); + m_findNext->Disable(); + m_findPrevious->Disable(); +} + +void FifoPlayerDlg::OnFindNextClick(wxCommandEvent& event) +{ + int cur_cmd_index = m_objectCmdList->GetSelection(); + if (cur_cmd_index == -1) + { + ChangeSearchResult(0); + return; + } + + for (std::vector<SearchResult>::iterator it = search_results.begin(); it != search_results.end(); ++it) + { + if (it->cmd_idx > cur_cmd_index) + { + ChangeSearchResult(it - search_results.begin()); + return; + } + } +} + +void FifoPlayerDlg::OnFindPreviousClick(wxCommandEvent& event) +{ + int cur_cmd_index = m_objectCmdList->GetSelection(); + if (cur_cmd_index == -1) + { + ChangeSearchResult(search_results.size() - 1); + return; + } + + for (std::vector<SearchResult>::reverse_iterator it = search_results.rbegin(); it != search_results.rend(); ++it) + { + if (it->cmd_idx < cur_cmd_index) + { + ChangeSearchResult(search_results.size()-1 - (it - search_results.rbegin())); + return; + } + } +} + +void FifoPlayerDlg::ChangeSearchResult(unsigned int result_idx) +{ + if (search_results.size() > result_idx) + { + m_search_result_idx = result_idx; + int prev_frame = m_framesList->GetSelection(); + int prev_obj = m_objectsList->GetSelection(); + int prev_cmd = m_objectCmdList->GetSelection(); + m_framesList->SetSelection(search_results[result_idx].frame_idx); + m_objectsList->SetSelection(search_results[result_idx].obj_idx); + m_objectCmdList->SetSelection(search_results[result_idx].cmd_idx); + + wxCommandEvent ev(wxEVT_COMMAND_LISTBOX_SELECTED); + if (prev_frame != m_framesList->GetSelection()) + { + ev.SetInt(m_framesList->GetSelection()); + OnFrameListSelectionChanged(ev); + } + if (prev_obj != m_objectsList->GetSelection()) + { + ev.SetInt(m_objectsList->GetSelection()); + OnObjectListSelectionChanged(ev); + } + if (prev_cmd != m_objectCmdList->GetSelection()) + { + ev.SetInt(m_objectCmdList->GetSelection()); + OnObjectCmdListSelectionChanged(ev); + } + } + else if (search_results.size()) + { + ChangeSearchResult(search_results.size() - 1); + } +} + +void FifoPlayerDlg::OnFrameListSelectionChanged(wxCommandEvent& event) +{ + FifoPlayer& player = FifoPlayer::GetInstance(); + + m_objectsList->Clear(); + if (event.GetInt() != -1) + { + int num_objects = player.GetAnalyzedFrameInfo(event.GetInt()).objectStarts.size(); + for (int i = 0; i < num_objects; ++i) + m_objectsList->Append(wxString::Format(wxT("Object %i"), i)); + } + + // Update object list + wxCommandEvent ev = wxCommandEvent(wxEVT_COMMAND_LISTBOX_SELECTED); + ev.SetInt(-1); + OnObjectListSelectionChanged(ev); +} + +void FifoPlayerDlg::OnObjectListSelectionChanged(wxCommandEvent& event) +{ + FifoPlayer& player = FifoPlayer::GetInstance(); + + int frame_idx = m_framesList->GetSelection(); + int object_idx = event.GetInt(); + + m_objectCmdList->Clear(); + m_objectCmdOffsets.clear(); + if (frame_idx != -1 && object_idx != -1) + { + const AnalyzedFrameInfo& frame = player.GetAnalyzedFrameInfo(frame_idx); + const FifoFrameInfo& fifo_frame = player.GetFile()->GetFrame(frame_idx); + const u8* objectdata_start = &fifo_frame.fifoData[frame.objectStarts[object_idx]]; + const u8* objectdata_end = &fifo_frame.fifoData[frame.objectEnds[object_idx]]; + u8* objectdata = (u8*)objectdata_start; + const int obj_offset = objectdata_start - &fifo_frame.fifoData[frame.objectStarts[0]]; + + int cmd = *objectdata++; + int stream_size = Common::swap16(objectdata); + objectdata += 2; + int vertex_size = (objectdata_end - objectdata) / stream_size; + wxString newLabel = wxString::Format(wxT("%08X: %02X %04X "), obj_offset, cmd, stream_size); + if ((objectdata_end - objectdata) % stream_size) newLabel += _("NOTE: Stream size doesn't match actual data length\n"); + while (objectdata < objectdata_end) + { + newLabel += wxString::Format(wxT("%02X"), *objectdata++); + } + m_objectCmdList->Append(newLabel); + m_objectCmdOffsets.push_back(0); + + + // Between objectdata_end and next_objdata_start, there are register setting commands + if (object_idx + 1 < (int)frame.objectStarts.size()) + { + const u8* next_objdata_start = &fifo_frame.fifoData[frame.objectStarts[object_idx+1]]; + while (objectdata < next_objdata_start) + { + m_objectCmdOffsets.push_back(objectdata - objectdata_start); + int new_offset = objectdata - &fifo_frame.fifoData[frame.objectStarts[0]]; + int cmd = *objectdata++; + switch (cmd) + { + case GX_NOP: + newLabel = _("NOP"); + break; + + case 0x44: + newLabel = _("0x44"); + break; + + case GX_CMD_INVL_VC: + newLabel = _("GX_CMD_INVL_VC"); + break; + + case GX_LOAD_CP_REG: + { + u32 cmd2 = *objectdata++; + u32 value = Common::swap32(objectdata); + objectdata += 4; + + newLabel = wxString::Format(wxT("CP %02X %08X"), cmd2, value); + } + break; + + case GX_LOAD_XF_REG: + { + u32 cmd2 = Common::swap32(objectdata); + objectdata += 4; + + u8 streamSize = ((cmd2 >> 16) & 15) + 1; + + const u8* stream_start = objectdata; + const u8* stream_end = stream_start + streamSize * 4; + + newLabel = wxString::Format(wxT("XF %08X "), cmd2); + while (objectdata < stream_end) + { + newLabel += wxString::Format(wxT("%02X"), *objectdata++); + if (((objectdata - stream_start) % 4) == 0) newLabel += wxT(" "); + } + } + break; + + case GX_LOAD_INDX_A: + case GX_LOAD_INDX_B: + case GX_LOAD_INDX_C: + case GX_LOAD_INDX_D: + objectdata += 4; + newLabel = wxString::Format(wxT("LOAD INDX %s"), (cmd == GX_LOAD_INDX_A) ? _("A") : + (cmd == GX_LOAD_INDX_B) ? _("B") : + (cmd == GX_LOAD_INDX_C) ? _("C") : _("D")); + break; + + case GX_CMD_CALL_DL: + // The recorder should have expanded display lists into the fifo stream and skipped the call to start them + // That is done to make it easier to track where memory is updated + _assert_(false); + objectdata += 8; + newLabel = wxString::Format(wxT("CALL DL")); + break; + + case GX_LOAD_BP_REG: + { + u32 cmd2 = Common::swap32(objectdata); + objectdata += 4; + newLabel = wxString::Format(wxT("BP %02X %06X"), cmd2 >> 24, cmd2 & 0xFFFFFF); + } + break; + + default: + newLabel = _("Unexpected 0x80 call? Aborting..."); + objectdata = (u8*)next_objdata_start; + break; + } + newLabel = wxString::Format(_("%08X: "), new_offset) + newLabel; + m_objectCmdList->Append(newLabel); + } + } + } + // Update command list + wxCommandEvent ev = wxCommandEvent(wxEVT_COMMAND_LISTBOX_SELECTED); + ev.SetInt(-1); + OnObjectCmdListSelectionChanged(ev); +} + +void FifoPlayerDlg::OnObjectCmdListSelectionChanged(wxCommandEvent& event) +{ + const int frame_idx = m_framesList->GetSelection(); + const int object_idx = m_objectsList->GetSelection(); + + if (event.GetInt() == -1 || frame_idx == -1 || object_idx == -1) + { + m_objectCmdInfo->SetLabel(wxEmptyString); + return; + } + + FifoPlayer& player = FifoPlayer::GetInstance(); + const AnalyzedFrameInfo& frame = player.GetAnalyzedFrameInfo(frame_idx); + const FifoFrameInfo& fifo_frame = player.GetFile()->GetFrame(frame_idx); + const u8* cmddata = &fifo_frame.fifoData[frame.objectStarts[object_idx]] + m_objectCmdOffsets[event.GetInt()]; + + // TODO: Not sure whether we should bother translating the descriptions + wxString newLabel; + if (*cmddata == GX_LOAD_BP_REG) + { + char name[64]="\0", desc[512]="\0"; + GetBPRegInfo(cmddata+1, name, sizeof(name), desc, sizeof(desc)); + newLabel = _("BP register "); + newLabel += (name[0] != '\0') ? wxString(name, *wxConvCurrent) : wxString::Format(_("UNKNOWN_%02X"), *(cmddata+1)); + newLabel += wxT(":\n"); + if (desc[0] != '\0') + newLabel += wxString(desc, *wxConvCurrent); + else + newLabel += _("No description available"); + } + else if (*cmddata == GX_LOAD_CP_REG) + newLabel = _("CP reg"); + else if (*cmddata == GX_LOAD_XF_REG) + newLabel = _("XF reg"); + else + newLabel = _("No description available"); + + m_objectCmdInfo->SetLabel(newLabel); + Layout(); + Fit(); +} + void FifoPlayerDlg::OnCloseClick(wxCommandEvent& WXUNUSED(event)) { Hide(); @@ -375,6 +812,25 @@ void FifoPlayerDlg::UpdateRecorderGui() m_Save->Enable(GetSaveButtonEnabled()); } +void FifoPlayerDlg::UpdateAnalyzerGui() +{ + FifoPlayer &player = FifoPlayer::GetInstance(); + FifoDataFile* file = player.GetFile(); + + int num_frames = (file) ? player.GetFile()->GetFrameCount() : 0; + if ((int)m_framesList->GetCount() != num_frames) + { + m_framesList->Clear(); + for (int i = 0; i < num_frames; ++i) + { + m_framesList->Append(wxString::Format(wxT("Frame %i"), i)); + } + wxCommandEvent ev = wxCommandEvent(wxEVT_COMMAND_LISTBOX_SELECTED); + ev.SetInt(-1); + OnFrameListSelectionChanged(ev); + } +} + wxString FifoPlayerDlg::CreateFileFrameCountLabel() const { FifoDataFile *file = FifoPlayer::GetInstance().GetFile(); diff --git a/Source/Core/DolphinWX/Src/FifoPlayerDlg.h b/Source/Core/DolphinWX/Src/FifoPlayerDlg.h index 7ecbef8de3..4e2c24fdd6 100644 --- a/Source/Core/DolphinWX/Src/FifoPlayerDlg.h +++ b/Source/Core/DolphinWX/Src/FifoPlayerDlg.h @@ -18,6 +18,7 @@ #ifndef __FIFO_PLAYER_DLG_h__ #define __FIFO_PLAYER_DLG_h__ +#include <vector> #include <wx/wx.h> #include <wx/notebook.h> @@ -44,11 +45,22 @@ private: void OnNumFramesToRecord( wxSpinEvent& event ); void OnCloseClick( wxCommandEvent& event ); + void OnBeginSearch(wxCommandEvent& event); + void OnFindNextClick(wxCommandEvent& event); + void OnFindPreviousClick(wxCommandEvent& event); + void OnSearchFieldTextChanged(wxCommandEvent& event); + void ChangeSearchResult(unsigned int result_idx); + void OnRecordingFinished(wxCommandEvent& event); void OnFrameWritten(wxCommandEvent& event); + void OnFrameListSelectionChanged(wxCommandEvent& event); + void OnObjectListSelectionChanged(wxCommandEvent& event); + void OnObjectCmdListSelectionChanged(wxCommandEvent& event); + void UpdatePlayGui(); void UpdateRecorderGui(); + void UpdateAnalyzerGui(); wxString CreateFileFrameCountLabel() const; wxString CreateCurrentFrameLabel() const; @@ -89,6 +101,28 @@ private: wxButton* m_Save; wxStaticText* m_FramesToRecordLabel; wxSpinCtrl* m_FramesToRecordCtrl; + + wxPanel* m_AnalyzePage; + wxListBox* m_framesList; + wxListBox* m_objectsList; + wxListBox* m_objectCmdList; + std::vector<u32> m_objectCmdOffsets; + wxStaticText* m_objectCmdInfo; + + wxTextCtrl* m_searchField; + wxButton* m_beginSearch; + wxButton* m_findNext; + wxButton* m_findPrevious; + wxStaticText* m_numResultsText; + + struct SearchResult { + int frame_idx; + int obj_idx; + int cmd_idx; + }; + std::vector<SearchResult> search_results; + unsigned int m_search_result_idx; + wxButton* m_Close; s32 m_FramesToRecord; diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index e7c4fca067..93e0cf8f15 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -500,19 +500,34 @@ void CFrame::OnActive(wxActivateEvent& event) { if (event.GetActive() && event.GetEventObject() == m_RenderFrame) { -#ifdef _WIN32 + // 32x32, 8bpp b/w image + // We want all transparent, so we can just use the same buffer for + // the "image" as for the transparency mask + static const char cursor_data[32 * 32] = { 0 }; + +#ifdef __WXGTK__ + wxCursor cursor_transparent = wxCursor(cursor_data, 32, 32, 6, 14, + cursor_data, wxWHITE, wxBLACK); +#else + wxBitmap cursor_bitmap(cursor_data, 32, 32); + cursor_bitmap.SetMask(new wxMask(cursor_bitmap)); + wxCursor cursor_transparent = wxCursor(cursor_bitmap.ConvertToImage()); +#endif + +#ifdef __WXMSW__ ::SetFocus((HWND)m_RenderParent->GetHandle()); #else m_RenderParent->SetFocus(); #endif + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor && Core::GetState() == Core::CORE_RUN) - m_RenderParent->SetCursor(wxCURSOR_BLANK); + m_RenderParent->SetCursor(cursor_transparent); } else { if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor) - m_RenderParent->SetCursor(wxCURSOR_ARROW); + m_RenderParent->SetCursor(wxNullCursor); } } event.Skip(); @@ -629,11 +644,6 @@ void CFrame::OnHostMessage(wxCommandEvent& event) m_RenderFrame->SetTitle(event.GetString()); break; - case WM_USER_CREATE: - if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor) - m_RenderParent->SetCursor(wxCURSOR_BLANK); - break; - case IDM_WINDOWSIZEREQUEST: { std::pair<int, int> *win_size = (std::pair<int, int> *)(event.GetClientData()); @@ -643,6 +653,11 @@ void CFrame::OnHostMessage(wxCommandEvent& event) break; #ifdef __WXGTK__ + case WM_USER_CREATE: + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor) + m_RenderParent->SetCursor(wxCURSOR_BLANK); + break; + case IDM_PANIC: { wxString caption = event.GetString().BeforeFirst(':'); @@ -666,8 +681,11 @@ void CFrame::GetRenderWindowSize(int& x, int& y, int& width, int& height) if (!wxIsMainThread()) wxMutexGuiEnter(); #endif - m_RenderParent->GetClientSize(&width, &height); - m_RenderParent->GetPosition(&x, &y); + wxRect client_rect = m_RenderParent->GetClientRect(); + width = client_rect.width; + height = client_rect.height; + x = client_rect.x; + y = client_rect.y; #ifdef __WXGTK__ if (!wxIsMainThread()) wxMutexGuiLeave(); diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 607c920906..a987ddebcd 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -632,12 +632,12 @@ void CFrame::BootGame(const std::string& filename) bootfile = m_GameListCtrl->GetSelectedISO()->GetFileName(); } else if (!StartUp.m_strDefaultGCM.empty() - && wxFileExists(wxString(StartUp.m_strDefaultGCM.c_str(), wxConvUTF8))) + && wxFileExists(wxSafeConvertMB2WX(StartUp.m_strDefaultGCM.c_str()))) bootfile = StartUp.m_strDefaultGCM; else { if (!SConfig::GetInstance().m_LastFilename.empty() - && wxFileExists(wxString(SConfig::GetInstance().m_LastFilename.c_str(), wxConvUTF8))) + && wxFileExists(wxSafeConvertMB2WX(SConfig::GetInstance().m_LastFilename.c_str()))) bootfile = SConfig::GetInstance().m_LastFilename; else { @@ -663,8 +663,8 @@ void CFrame::DoOpen(bool Boot) wxString path = wxFileSelector( _("Select the file to load"), wxEmptyString, wxEmptyString, wxEmptyString, - _("All GC/Wii files (elf, dol, gcm, iso, ciso, gcz, wad)") + - wxString::Format(wxT("|*.elf;*.dol;*.gcm;*.iso;*.ciso;*.gcz;*.wad;*.dff;*.tmd|%s"), + _("All GC/Wii files (elf, dol, gcm, iso, wbfs, ciso, gcz, wad)") + + wxString::Format(wxT("|*.elf;*.dol;*.gcm;*.iso;*.wbfs;*.ciso;*.gcz;*.wad;*.dff;*.tmd|%s"), wxGetTranslation(wxALL_FILES)), wxFD_OPEN | wxFD_FILE_MUST_EXIST, this); @@ -826,11 +826,9 @@ void CFrame::OnRenderParentResize(wxSizeEvent& event) SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowHeight = height; } #if defined(HAVE_X11) && HAVE_X11 - int x, y; - m_RenderParent->GetClientSize(&width, &height); - m_RenderParent->GetPosition(&x, &y); + wxRect client_rect = m_RenderParent->GetClientRect(); X11Utils::SendClientEvent(X11Utils::XDisplayFromHandle(GetHandle()), - "RESIZE", x, y, width, height); + "RESIZE", client_rect.x, client_rect.y, client_rect.width, client_rect.height); #endif m_LogWindow->Refresh(); m_LogWindow->Update(); @@ -892,7 +890,6 @@ void CFrame::ToggleDisplayMode(bool bFullscreen) if (w != x || h != y || d != 32) continue;; - CGDisplayCapture(CGMainDisplayID()); CGDisplaySwitchToMode(CGMainDisplayID(), mode); } @@ -916,6 +913,10 @@ void CFrame::StartGame(const std::string& filename) m_RenderParent = m_Panel; m_RenderFrame = this; + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bKeepWindowOnTop) + m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() | wxSTAY_ON_TOP); + else + m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() & ~wxSTAY_ON_TOP); } else { @@ -930,6 +931,11 @@ void CFrame::StartGame(const std::string& filename) #endif m_RenderFrame = new CRenderFrame((wxFrame*)this, wxID_ANY, _("Dolphin"), position); + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bKeepWindowOnTop) + m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() | wxSTAY_ON_TOP); + else + m_RenderFrame->SetWindowStyle(m_RenderFrame->GetWindowStyle() & ~wxSTAY_ON_TOP); + wxSize size(SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowWidth, SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowHeight); m_RenderFrame->SetClientSize(size.GetWidth(), size.GetHeight()); @@ -1037,10 +1043,23 @@ void CFrame::DoPause() } else { + // 32x32, 8bpp b/w image + // We want all transparent, so we can just use the same buffer for + // the "image" as for the transparency mask + static const char cursor_data[32 * 32] = { 0 }; +#ifdef __WXGTK__ + wxCursor cursor_transparent = wxCursor(cursor_data, 32, 32, 6, 14, + cursor_data, wxWHITE, wxBLACK); +#else + wxBitmap cursor_bitmap(cursor_data, 32, 32); + cursor_bitmap.SetMask(new wxMask(cursor_bitmap)); + wxCursor cursor_transparent = wxCursor(cursor_bitmap.ConvertToImage()); +#endif + Core::SetState(Core::CORE_RUN); if (SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor && RendererHasFocus()) - m_RenderParent->SetCursor(wxCURSOR_BLANK); + m_RenderParent->SetCursor(cursor_transparent); } UpdateGUI(); } @@ -1375,17 +1394,13 @@ void CFrame::OnInstallWAD(wxCommandEvent& event) wxProgressDialog dialog(_("Installing WAD..."), _("Working..."), - 1000, // range - this, // parent + 1000, + this, wxPD_APP_MODAL | - wxPD_ELAPSED_TIME | - wxPD_ESTIMATED_TIME | - wxPD_REMAINING_TIME | - wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | + wxPD_SMOOTH ); - dialog.CenterOnParent(); - u64 titleID = DiscIO::CNANDContentManager::Access().Install_WiiWAD(fileName); if (titleID == TITLEID_SYSMENU) { @@ -1551,16 +1566,21 @@ void CFrame::UpdateGUI() bool Initialized = Core::IsRunning(); bool Running = Core::GetState() == Core::CORE_RUN; bool Paused = Core::GetState() == Core::CORE_PAUSE; + bool RunningWii = Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii; + bool RunningGamecube = Initialized && !SConfig::GetInstance().m_LocalCoreStartupParameter.bWii; // Make sure that we have a toolbar if (m_ToolBar) { // Enable/disable the Config and Stop buttons m_ToolBar->EnableTool(wxID_OPEN, !Initialized); - m_ToolBar->EnableTool(wxID_REFRESH, !Initialized); // Don't allow refresh when we don't show the list + // Don't allow refresh when we don't show the list + m_ToolBar->EnableTool(wxID_REFRESH, !Initialized); m_ToolBar->EnableTool(IDM_STOP, Running || Paused); m_ToolBar->EnableTool(IDM_TOGGLE_FULLSCREEN, Running || Paused); m_ToolBar->EnableTool(IDM_SCREENSHOT, Running || Paused); + // Don't allow wiimote config while in Gamecube mode + m_ToolBar->EnableTool(IDM_CONFIG_WIIMOTE_PLUGIN, !RunningGamecube); } // File @@ -1590,15 +1610,12 @@ void CFrame::UpdateGUI() if (DiscIO::CNANDContentManager::Access().GetNANDLoader(TITLEID_SYSMENU).IsValid()) GetMenuBar()->FindItem(IDM_LOAD_WII_MENU)->Enable(!Initialized); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)-> - Enable(Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)-> - Enable(Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)-> - Enable(Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii); - GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)-> - Enable(Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii); - if (Initialized && SConfig::GetInstance().m_LocalCoreStartupParameter.bWii) + GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Enable(RunningWii); + GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Enable(RunningWii); + GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->Enable(RunningWii); + GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Enable(RunningWii); + GetMenuBar()->FindItem(IDM_CONFIG_WIIMOTE_PLUGIN)->Enable(!RunningGamecube); + if (RunningWii) { GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Check(GetUsbPointer()-> AccessWiiMote(0x0100)->IsConnected()); @@ -1644,7 +1661,7 @@ void CFrame::UpdateGUI() } // Prepare to load last selected file, enable play button else if (!SConfig::GetInstance().m_LastFilename.empty() - && wxFileExists(wxString(SConfig::GetInstance().m_LastFilename.c_str(), wxConvUTF8))) + && wxFileExists(wxSafeConvertMB2WX(SConfig::GetInstance().m_LastFilename.c_str()))) { if (m_ToolBar) m_ToolBar->EnableTool(IDM_PLAY, true); diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp index 8e0a498915..4a7d7d5dce 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp @@ -149,9 +149,6 @@ BEGIN_EVENT_TABLE(wxEmuStateTip, wxTipWindow) END_EVENT_TABLE() BEGIN_EVENT_TABLE(CGameListCtrl, wxListCtrl) -#ifdef _WIN32 - EVT_PAINT(CGameListCtrl::OnPaintDrawImages) -#endif EVT_SIZE(CGameListCtrl::OnSize) EVT_RIGHT_DOWN(CGameListCtrl::OnRightClick) EVT_LEFT_DOWN(CGameListCtrl::OnLeftClick) @@ -299,14 +296,19 @@ void CGameListCtrl::Update() InsertColumn(COLUMN_SIZE, _("Size")); InsertColumn(COLUMN_EMULATION_STATE, _("State")); - +#ifdef __WXMSW__ + const int platform_padding = 0; +#else + const int platform_padding = 8; +#endif + // set initial sizes for columns - SetColumnWidth(COLUMN_PLATFORM, 35); - SetColumnWidth(COLUMN_BANNER, 96); - SetColumnWidth(COLUMN_TITLE, 200); - SetColumnWidth(COLUMN_NOTES, 200); - SetColumnWidth(COLUMN_COUNTRY, 32); - SetColumnWidth(COLUMN_EMULATION_STATE, 50); + SetColumnWidth(COLUMN_PLATFORM, 35 + platform_padding); + SetColumnWidth(COLUMN_BANNER, 96 + platform_padding); + SetColumnWidth(COLUMN_TITLE, 200 + platform_padding); + SetColumnWidth(COLUMN_NOTES, 200 + platform_padding); + SetColumnWidth(COLUMN_COUNTRY, 32 + platform_padding); + SetColumnWidth(COLUMN_EMULATION_STATE, 50 + platform_padding); // add all items for (int i = 0; i < (int)m_ISOFiles.size(); i++) @@ -384,48 +386,6 @@ std::string CGameListCtrl::GetGameNames() const return m_gameList; } -#ifdef _WIN32 -// This draws our icons on top of the gamelist, it's only used on Windows -void CGameListCtrl::OnPaintDrawImages(wxPaintEvent& event) -{ - wxPaintDC dc(this); - - // Calls the default drawing code - wxControl::OnPaint(event); - - // Draw the flags, platform icons and emustate icons on top if there's games to show - if (m_ISOFiles.empty()) - return; - - // Retrieve the topmost shown item and get drawing offsets - const long - top_item = GetTopItem(), - bottom_item = std::min(top_item + GetCountPerPage() + 2, (long)GetItemCount()); - - int flagOffset = GetColumnWidth(0) + GetColumnWidth(1) + - GetColumnWidth(2) + GetColumnWidth(3); - int stateOffset = flagOffset + GetColumnWidth(4) + GetColumnWidth(5); - - // Only redraw shown lines - for (long i = top_item; i != bottom_item; ++i) - { - wxRect itemRect; - if (GetItemRect(i, itemRect)) - { - const int itemY = itemRect.GetTop(); - const GameListItem& rISOFile = *m_ISOFiles[GetItemData(i)]; - - m_imageListSmall->Draw(m_PlatformImageIndex[rISOFile.GetPlatform()], - dc, itemRect.GetX()+3, itemY); - m_imageListSmall->Draw(m_FlagImageIndex[rISOFile.GetCountry()], - dc, flagOffset, itemY); - m_imageListSmall->Draw(m_EmuStateImageIndex[rISOFile.GetEmuState()], - dc, stateOffset, itemY); - } - } -} -#endif - void CGameListCtrl::InsertItemInReportView(long _Index) { // When using wxListCtrl, there is no hope of per-column text colors. @@ -455,12 +415,8 @@ void CGameListCtrl::InsertItemInReportView(long _Index) m_gamePath.append(rISOFile.GetFileName() + '\n'); // Insert a first row with the platform image, that will be used as the Index -#ifndef _WIN32 long ItemIndex = InsertItem(_Index, wxEmptyString, m_PlatformImageIndex[rISOFile.GetPlatform()]); -#else - long ItemIndex = InsertItem(_Index, wxEmptyString, -1); -#endif if (rISOFile.GetImage().IsOk()) ImageIndex = m_imageListSmall->Add(rISOFile.GetImage()); @@ -516,13 +472,11 @@ void CGameListCtrl::InsertItemInReportView(long _Index) SetItem(_Index, COLUMN_TITLE, name, -1); SetItem(_Index, COLUMN_NOTES, description, -1); -#ifndef _WIN32 // Emulation state SetItemColumnImage(_Index, COLUMN_EMULATION_STATE, m_EmuStateImageIndex[rISOFile.GetEmuState()]); // Country SetItemColumnImage(_Index, COLUMN_COUNTRY, m_FlagImageIndex[rISOFile.GetCountry()]); -#endif // File size SetItem(_Index, COLUMN_SIZE, NiceSizeFormat(rISOFile.GetFileSize()), -1); @@ -599,6 +553,7 @@ void CGameListCtrl::ScanForISOs() Extensions.push_back("*.iso"); Extensions.push_back("*.ciso"); Extensions.push_back("*.gcz"); + Extensions.push_back("*.wbfs"); } if (SConfig::GetInstance().m_ListWad) Extensions.push_back("*.wad"); @@ -608,17 +563,17 @@ void CGameListCtrl::ScanForISOs() if (rFilenames.size() > 0) { - wxProgressDialog dialog(_("Scanning for ISOs"), - _("Scanning..."), - (int)rFilenames.size(), // range - this, // parent - wxPD_APP_MODAL | - wxPD_ELAPSED_TIME | - wxPD_ESTIMATED_TIME | - wxPD_REMAINING_TIME | - wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small - ); - dialog.CenterOnParent(); + wxProgressDialog dialog( + _("Scanning for ISOs"), + _("Scanning..."), + (int)rFilenames.size() - 1, + this, + wxPD_APP_MODAL | + wxPD_AUTO_HIDE | + wxPD_CAN_ABORT | + wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | + wxPD_SMOOTH // - makes updates as small as possible (down to 1px) + ); for (u32 i = 0; i < rFilenames.size(); i++) { @@ -626,9 +581,9 @@ void CGameListCtrl::ScanForISOs() SplitPath(rFilenames[i], NULL, &FileName, NULL); // Update with the progress (i) and the message - bool Cont = dialog.Update(i, - wxString::Format(_("Scanning %s"), wxString(FileName.c_str(), *wxConvCurrent).c_str())); - if (!Cont) + dialog.Update(i, wxString::Format(_("Scanning %s"), + wxString(FileName.c_str(), *wxConvCurrent).c_str())); + if (dialog.WasCancelled()) break; std::auto_ptr<GameListItem> iso_file(new GameListItem(rFilenames[i])); @@ -723,8 +678,8 @@ const GameListItem *CGameListCtrl::GetISO(size_t index) const CGameListCtrl *caller; #if wxCHECK_VERSION(2, 9, 0) -int wxCALLBACK wxListCompare(long item1, long item2, wxIntPtr sortData) -#else +int wxCALLBACK wxListCompare(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData) +#else // 2.8.x int wxCALLBACK wxListCompare(long item1, long item2, long sortData) #endif { @@ -1140,20 +1095,15 @@ void CGameListCtrl::CompressSelection(bool _compress) if (browseDialog.ShowModal() != wxID_OK) return; - wxProgressDialog progressDialog(_compress ? - _("Compressing ISO") : _("Decompressing ISO"), - _("Working..."), - 1000, // range - this, // parent - wxPD_APP_MODAL | - wxPD_ELAPSED_TIME | - wxPD_ESTIMATED_TIME | - wxPD_REMAINING_TIME | - wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small - ); - - progressDialog.SetSize(wxSize(340, 180)); - progressDialog.CenterOnParent(); + wxProgressDialog progressDialog( + _compress ? _("Compressing ISO") : _("Decompressing ISO"), + _("Working..."), + 1000, + this, + wxPD_APP_MODAL | + wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | + wxPD_SMOOTH + ); m_currentItem = 0; m_numberItem = GetSelectedItemCount(); @@ -1273,20 +1223,15 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event)) _("Confirm File Overwrite"), wxYES_NO) == wxNO); - wxProgressDialog dialog(iso->IsCompressed() ? - _("Decompressing ISO") : _("Compressing ISO"), - _("Working..."), - 1000, // range - this, // parent - wxPD_APP_MODAL | - wxPD_ELAPSED_TIME | - wxPD_ESTIMATED_TIME | - wxPD_REMAINING_TIME | - wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small - ); - - dialog.SetSize(wxSize(340, 180)); - dialog.CenterOnParent(); + wxProgressDialog dialog( + iso->IsCompressed() ? _("Decompressing ISO") : _("Compressing ISO"), + _("Working..."), + 1000, + this, + wxPD_APP_MODAL | + wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | + wxPD_SMOOTH + ); if (iso->IsCompressed()) DiscIO::DecompressBlobToFile(iso->GetFileName().c_str(), diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.h b/Source/Core/DolphinWX/Src/GameListCtrl.h index 8fca14f632..274cfdb7ee 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.h +++ b/Source/Core/DolphinWX/Src/GameListCtrl.h @@ -99,7 +99,6 @@ private: DECLARE_EVENT_TABLE() // events - void OnPaintDrawImages(wxPaintEvent& event); void OnLeftClick(wxMouseEvent& event); void OnRightClick(wxMouseEvent& event); void OnMouseMotion(wxMouseEvent& event); diff --git a/Source/Core/DolphinWX/Src/ISOProperties.cpp b/Source/Core/DolphinWX/Src/ISOProperties.cpp index b5e5c82d1d..f004989055 100644 --- a/Source/Core/DolphinWX/Src/ISOProperties.cpp +++ b/Source/Core/DolphinWX/Src/ISOProperties.cpp @@ -75,6 +75,7 @@ BEGIN_EVENT_TABLE(CISOProperties, wxDialog) EVT_MENU(IDM_EXTRACTALL, CISOProperties::OnExtractDir) EVT_MENU(IDM_EXTRACTAPPLOADER, CISOProperties::OnExtractDataFromHeader) EVT_MENU(IDM_EXTRACTDOL, CISOProperties::OnExtractDataFromHeader) + EVT_MENU(IDM_CHECKINTEGRITY, CISOProperties::CheckPartitionIntegrity) EVT_CHOICE(ID_LANG, CISOProperties::OnChangeBannerLang) END_EVENT_TABLE() @@ -635,6 +636,13 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event) popupMenu->Append(IDM_EXTRACTAPPLOADER, _("Extract Apploader...")); popupMenu->Append(IDM_EXTRACTDOL, _("Extract DOL...")); + if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 0 + && m_Treectrl->GetFirstVisibleItem() != m_Treectrl->GetSelection()) + { + popupMenu->AppendSeparator(); + popupMenu->Append(IDM_CHECKINTEGRITY, _("Check Partition Integrity")); + } + PopupMenu(popupMenu); event.Skip(); @@ -718,22 +726,26 @@ void CISOProperties::ExportDir(const char* _rFullPath, const char* _rExportFolde } wxString dialogTitle = index[0] ? _("Extracting Directory") : _("Extracting All Files"); - wxProgressDialog dialog(dialogTitle, - _("Extracting..."), - index[1], // range - this, // parent - wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_CAN_ABORT | - wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | - wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small - ); - dialog.CenterOnParent(); + wxProgressDialog dialog( + dialogTitle, + _("Extracting..."), + index[1] - 1, + this, + wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_CAN_ABORT | + wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | + wxPD_SMOOTH + ); // Extraction for (u32 i = index[0]; i < index[1]; i++) { dialog.SetTitle(wxString::Format(wxT("%s : %d%%"), dialogTitle.c_str(), (u32)(((float)(i - index[0]) / (float)(index[1] - index[0])) * 100))); - if (!dialog.Update(i, wxString::Format(_("Extracting %s"), wxString(fst[i]->m_FullPath, *wxConvCurrent).c_str()))) + + dialog.Update(i, wxString::Format(_("Extracting %s"), + wxString(fst[i]->m_FullPath, *wxConvCurrent).c_str())); + + if (dialog.WasCancelled()) break; if (fst[i]->IsDirectory()) @@ -836,6 +848,71 @@ void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event) PanicAlertT("Failed to extract to %s!", (const char *)Path.mb_str()); } +class IntegrityCheckThread : public wxThread +{ +public: + IntegrityCheckThread(const WiiPartition& Partition) + : wxThread(wxTHREAD_JOINABLE), m_Partition(Partition) + { + Create(); + } + + virtual ExitCode Entry() + { + return (ExitCode)m_Partition.Partition->CheckIntegrity(); + } + +private: + const WiiPartition& m_Partition; +}; + +void CISOProperties::CheckPartitionIntegrity(wxCommandEvent& event) +{ + // Normally we can't enter this function if we aren't analyzing a Wii disc + // anyway, but let's still check to be sure. + if (!DiscIO::IsVolumeWiiDisc(OpenISO)) + return; + + wxString PartitionName = m_Treectrl->GetItemText(m_Treectrl->GetSelection()); + if (!PartitionName) + return; + + // Get the partition number from the item text ("Partition N") + int PartitionNum = wxAtoi(PartitionName.SubString(10, 11)); + const WiiPartition& Partition = WiiDisc[PartitionNum]; + + wxProgressDialog* dialog = new wxProgressDialog( + _("Checking integrity..."), _("Working..."), 1000, this, + wxPD_APP_MODAL | wxPD_ELAPSED_TIME | wxPD_SMOOTH + ); + + IntegrityCheckThread thread(Partition); + thread.Run(); + + while (thread.IsAlive()) + { + dialog->Pulse(); + wxThread::Sleep(50); + } + + delete dialog; + + if (!thread.Wait()) + { + wxMessageBox( + wxString::Format(_("Integrity check for partition %d failed. " + "Your dump is most likely corrupted or has been " + "patched incorrectly."), PartitionNum), + _("Integrity Check Error"), wxOK | wxICON_ERROR, this + ); + } + else + { + wxMessageBox(_("Integrity check completed. No errors have been found."), + _("Integrity check completed"), wxOK | wxICON_INFORMATION, this); + } +} + void CISOProperties::SetRefresh(wxCommandEvent& event) { bRefreshList = true; diff --git a/Source/Core/DolphinWX/Src/ISOProperties.h b/Source/Core/DolphinWX/Src/ISOProperties.h index 6e72993b42..da275136fe 100644 --- a/Source/Core/DolphinWX/Src/ISOProperties.h +++ b/Source/Core/DolphinWX/Src/ISOProperties.h @@ -170,6 +170,7 @@ private: IDM_EXTRACTFILE, IDM_EXTRACTAPPLOADER, IDM_EXTRACTDOL, + IDM_CHECKINTEGRITY, IDM_BNRSAVEAS }; @@ -186,6 +187,7 @@ private: void OnExtractFile(wxCommandEvent& event); void OnExtractDir(wxCommandEvent& event); void OnExtractDataFromHeader(wxCommandEvent& event); + void CheckPartitionIntegrity(wxCommandEvent& event); void SetRefresh(wxCommandEvent& event); void OnChangeBannerLang(wxCommandEvent& event); void PHackButtonClicked(wxCommandEvent& event); diff --git a/Source/Core/DolphinWX/Src/InputConfigDiag.cpp b/Source/Core/DolphinWX/Src/InputConfigDiag.cpp index 87cecde27d..b3d57ae89c 100644 --- a/Source/Core/DolphinWX/Src/InputConfigDiag.cpp +++ b/Source/Core/DolphinWX/Src/InputConfigDiag.cpp @@ -887,7 +887,7 @@ ControlGroupsSizer::ControlGroupsSizer(ControllerEmu* const controller, wxWindow } GamepadPage::GamepadPage(wxWindow* parent, InputPlugin& plugin, const unsigned int pad_num, InputConfigDialog* const config_dialog) - : wxNotebookPage(parent, -1 , wxDefaultPosition, wxDefaultSize) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) ,controller(plugin.controllers[pad_num]) , m_config_dialog(config_dialog) , m_plugin(plugin) diff --git a/Source/Core/DolphinWX/Src/InputConfigDiag.h b/Source/Core/DolphinWX/Src/InputConfigDiag.h index 54f828b952..53f06a1144 100644 --- a/Source/Core/DolphinWX/Src/InputConfigDiag.h +++ b/Source/Core/DolphinWX/Src/InputConfigDiag.h @@ -177,7 +177,7 @@ public: class InputConfigDialog; -class GamepadPage : public wxNotebookPage +class GamepadPage : public wxPanel { friend class InputConfigDialog; friend class ControlDialog; diff --git a/Source/Core/DolphinWX/Src/LogWindow.cpp b/Source/Core/DolphinWX/Src/LogWindow.cpp index 0d11ef0142..4c9c495713 100644 --- a/Source/Core/DolphinWX/Src/LogWindow.cpp +++ b/Source/Core/DolphinWX/Src/LogWindow.cpp @@ -41,7 +41,7 @@ CLogWindow::CLogWindow(CFrame *parent, wxWindowID id, const wxPoint& pos, , x(0), y(0), winpos(0) , Parent(parent), m_ignoreLogTimer(false), m_LogAccess(true) , m_Log(NULL), m_cmdline(NULL), m_FontChoice(NULL) - , m_SJISConv(*(wxCSConv*)wxConvCurrent) + , m_SJISConv(wxT("")) { #ifdef _WIN32 static bool validCP932 = ::IsValidCodePage(932) != 0; @@ -52,6 +52,7 @@ CLogWindow::CLogWindow(CFrame *parent, wxWindowID id, const wxPoint& pos, else { WARN_LOG(COMMON, "Cannot Convert from Charset Windows Japanese cp 932"); + m_SJISConv = *(wxCSConv*)wxConvCurrent; } #else // on linux the wrong string is returned from wxFontMapper::GetEncodingName(wxFONTENCODING_SHIFT_JIS) diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp index 709c2b4b53..d38c90e07f 100644 --- a/Source/Core/DolphinWX/Src/Main.cpp +++ b/Source/Core/DolphinWX/Src/Main.cpp @@ -115,37 +115,37 @@ bool DolphinApp::OnInit() wxCmdLineEntryDesc cmdLineDesc[] = { { - wxCMD_LINE_SWITCH, wxS("h"), wxS("help"), + wxCMD_LINE_SWITCH, "h", "help", _("Show this help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, { - wxCMD_LINE_SWITCH, wxS("d"), wxS("debugger"), + wxCMD_LINE_SWITCH, "d", "debugger", _("Opens the debugger"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, { - wxCMD_LINE_SWITCH, wxS("l"), wxS("logger"), + wxCMD_LINE_SWITCH, "l", "logger", _("Opens the logger"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, { - wxCMD_LINE_OPTION, wxS("e"), wxS("exec"), + wxCMD_LINE_OPTION, "e", "exec", _("Loads the specified file (DOL,ELF,GCM,ISO,WAD)"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { - wxCMD_LINE_SWITCH, wxS("b"), wxS("batch"), + wxCMD_LINE_SWITCH, "b", "batch", _("Exit Dolphin with emulator"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, { - wxCMD_LINE_OPTION, wxS("V"), wxS("video_backend"), + wxCMD_LINE_OPTION, "V", "video_backend", _("Specify a video backend"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { - wxCMD_LINE_OPTION, wxS("A"), wxS("audio_emulation"), + wxCMD_LINE_OPTION, "A", "audio_emulation", _("Low level (LLE) or high level (HLE) audio"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, diff --git a/Source/Core/DolphinWX/Src/MemcardManager.cpp b/Source/Core/DolphinWX/Src/MemcardManager.cpp index 98390122e2..a6ed1513c6 100644 --- a/Source/Core/DolphinWX/Src/MemcardManager.cpp +++ b/Source/Core/DolphinWX/Src/MemcardManager.cpp @@ -101,6 +101,7 @@ CMemcardManager::CMemcardManager(wxWindow* parent, wxWindowID id, const wxString memoryCard[SLOT_A]=NULL; memoryCard[SLOT_B]=NULL; + mcmSettings.twoCardsLoaded = false; if (!LoadSettings()) { itemsPerPage = 16; @@ -283,7 +284,7 @@ void CMemcardManager::ChangePath(int slot) m_PrevPage[slot]->Disable(); m_MemcardList[slot]->prevPage = false; } - if (!strcasecmp(m_MemcardPath[slot2]->GetPath().mb_str(), m_MemcardPath[slot]->GetPath().mb_str())) + if (!m_MemcardPath[SLOT_A]->GetPath().CmpNoCase(m_MemcardPath[SLOT_B]->GetPath())) { if(m_MemcardPath[slot]->GetPath().length()) PanicAlertT("Memcard already opened"); @@ -292,7 +293,10 @@ void CMemcardManager::ChangePath(int slot) { if (m_MemcardPath[slot]->GetPath().length() && ReloadMemcard(m_MemcardPath[slot]->GetPath().mb_str(), slot)) { - mcmSettings.twoCardsLoaded = true; + if (memoryCard[slot2]) + { + mcmSettings.twoCardsLoaded = true; + } m_SaveImport[slot]->Enable(); m_SaveExport[slot]->Enable(); m_Delete[slot]->Enable(); @@ -318,16 +322,9 @@ void CMemcardManager::ChangePath(int slot) } } } - if (m_Delete[SLOT_A]->IsEnabled() && m_Delete[SLOT_B]->IsEnabled()) - { - m_CopyFrom[SLOT_A]->Enable(); - m_CopyFrom[SLOT_B]->Enable(); - } - else - { - m_CopyFrom[SLOT_A]->Disable(); - m_CopyFrom[SLOT_B]->Disable(); - } + + m_CopyFrom[SLOT_A]->Enable(mcmSettings.twoCardsLoaded); + m_CopyFrom[SLOT_B]->Enable(mcmSettings.twoCardsLoaded); } void CMemcardManager::OnPageChange(wxCommandEvent& event) @@ -496,6 +493,7 @@ void CMemcardManager::CopyDeleteClick(wxCommandEvent& event) slot2 = SLOT_B; case ID_COPYFROM_A: index = slot2 ? index_B : index_A; + index = memoryCard[slot2]->GetFileIndex(index); if ((index != wxNOT_FOUND)) { CopyDeleteSwitch(memoryCard[slot]->CopyFrom(*memoryCard[slot2], index), slot); @@ -545,17 +543,19 @@ void CMemcardManager::CopyDeleteClick(wxCommandEvent& event) slot=SLOT_A; index = index_A; case ID_SAVEEXPORT_B: + index = memoryCard[slot]->GetFileIndex(index); if (index != wxNOT_FOUND) { - char tempC[10 + DENTRY_STRLEN], - tempC2[DENTRY_STRLEN]; - memoryCard[slot]->DEntry_GameCode(index,tempC); - memoryCard[slot]->DEntry_FileName(index,tempC2); - sprintf(tempC, "%s_%s.gci", tempC, tempC2); + std::string gciFilename; + if (!memoryCard[slot]->GCI_FileName(index, gciFilename)) + { + PanicAlert("invalid index"); + return; + } wxString fileName = wxFileSelector( _("Export save as..."), wxString::From8BitData(DefaultIOPath.c_str()), - wxString::From8BitData(tempC), wxT(".gci"), + wxString::From8BitData(gciFilename.c_str()), wxT(".gci"), _("Native GCI files(*.gci)") + wxString(wxT("|*.gci|")) + _("MadCatz Gameshark files(*.gcs)") + wxString(wxT("|*.gcs|")) + _("Datel MaxDrive/Pro files(*.sav)") + wxString(wxT("|*.sav")), @@ -563,7 +563,7 @@ void CMemcardManager::CopyDeleteClick(wxCommandEvent& event) if (fileName.length() > 0) { - if (!CopyDeleteSwitch(memoryCard[slot]->ExportGci(index, fileName.mb_str(), NULL), -1)) + if (!CopyDeleteSwitch(memoryCard[slot]->ExportGci(index, fileName.mb_str(), ""), -1)) { File::Delete(std::string(fileName.mb_str())); } @@ -583,7 +583,7 @@ void CMemcardManager::CopyDeleteClick(wxCommandEvent& event) "%s\nand have the same name as a file on your memcard\nContinue?", path1.c_str())) for (int i = 0; i < DIRLEN; i++) { - CopyDeleteSwitch(memoryCard[slot]->ExportGci(i, ".", &path1), -1); + CopyDeleteSwitch(memoryCard[slot]->ExportGci(i, NULL, path1), -1); } break; } @@ -591,6 +591,7 @@ void CMemcardManager::CopyDeleteClick(wxCommandEvent& event) slot = SLOT_A; index = index_A; case ID_DELETE_B: + index = memoryCard[slot]->GetFileIndex(index); if (index != wxNOT_FOUND) { CopyDeleteSwitch(memoryCard[slot]->RemoveFile(index), slot); @@ -614,8 +615,7 @@ bool CMemcardManager::ReloadMemcard(const char *fileName, int card) wxComment, wxBlock, wxFirstBlock, - wxLabel, - tString; + wxLabel; m_MemcardList[card]->Hide(); @@ -631,18 +631,19 @@ bool CMemcardManager::ReloadMemcard(const char *fileName, int card) wxImageList *list = m_MemcardList[card]->GetImageList(wxIMAGE_LIST_SMALL); list->RemoveAll(); - int nFiles = memoryCard[card]->GetNumFiles(); + u8 nFiles = memoryCard[card]->GetNumFiles(); int *images = new int[nFiles*2]; - for (int i = 0;i < nFiles;i++) + for (u8 i = 0;i < nFiles;i++) { static u32 pxdata[96*32]; static u8 animDelay[8]; static u32 animData[32*32*8]; - int numFrames = memoryCard[card]->ReadAnimRGBA8(i,animData,animDelay); + u8 fileIndex = memoryCard[card]->GetFileIndex(i); + int numFrames = memoryCard[card]->ReadAnimRGBA8(fileIndex, animData, animDelay); - if (!memoryCard[card]->ReadBannerRGBA8(i,pxdata)) + if (!memoryCard[card]->ReadBannerRGBA8(fileIndex, pxdata)) { memset(pxdata,0,96*32*4); @@ -688,17 +689,17 @@ bool CMemcardManager::ReloadMemcard(const char *fileName, int card) for (j = page[card] * itemsPerPage; (j < nFiles) && (j < pagesMax); j++) { - char title[DENTRY_STRLEN]; - char comment[DENTRY_STRLEN]; u16 blocks; u16 firstblock; + u8 fileIndex = memoryCard[card]->GetFileIndex(j); + int index = m_MemcardList[card]->InsertItem(j, wxEmptyString); m_MemcardList[card]->SetItem(index, COLUMN_BANNER, wxEmptyString); - if (!memoryCard[card]->DEntry_Comment1(j, title)) title[0]=0; - if (!memoryCard[card]->DEntry_Comment2(j, comment)) comment[0]=0; + std::string title = memoryCard[card]->GetSaveComment1(fileIndex); + std::string comment = memoryCard[card]->GetSaveComment2(fileIndex); bool ascii = memoryCard[card]->IsAsciiEncoding(); @@ -718,20 +719,20 @@ bool CMemcardManager::ReloadMemcard(const char *fileName, int card) // it returns CP-932, in order to use iconv we need to use CP932 wxCSConv SJISConv(wxT("CP932")); #endif - wxTitle = wxString(title, ascii ? *wxConvCurrent : SJISConv); - wxComment = wxString(comment, ascii ? *wxConvCurrent : SJISConv); + wxTitle = wxString(title.c_str(), ascii ? *wxConvCurrent : SJISConv); + wxComment = wxString(comment.c_str(), ascii ? *wxConvCurrent : SJISConv); m_MemcardList[card]->SetItem(index, COLUMN_TITLE, wxTitle); m_MemcardList[card]->SetItem(index, COLUMN_COMMENT, wxComment); - blocks = memoryCard[card]->DEntry_BlockCount(j); + blocks = memoryCard[card]->DEntry_BlockCount(fileIndex); if (blocks == 0xFFFF) blocks = 0; wxBlock.Printf(wxT("%10d"), blocks); m_MemcardList[card]->SetItem(index,COLUMN_BLOCKS, wxBlock); - firstblock = memoryCard[card]->DEntry_FirstBlock(j); - if (firstblock == 0xFFFF) firstblock = 3; // to make firstblock -1 - wxFirstBlock.Printf(wxT("%15d"), firstblock-4); - m_MemcardList[card]->SetItem(index,COLUMN_FIRSTBLOCK, wxFirstBlock); + firstblock = memoryCard[card]->DEntry_FirstBlock(fileIndex); + //if (firstblock == 0xFFFF) firstblock = 3; // to make firstblock -1 + wxFirstBlock.Printf(wxT("%15d"), firstblock); + m_MemcardList[card]->SetItem(index, COLUMN_FIRSTBLOCK, wxFirstBlock); m_MemcardList[card]->SetItem(index, COLUMN_ICON, wxEmptyString); if (images[j] >= 0) diff --git a/Source/Core/DolphinWX/Src/NetWindow.cpp b/Source/Core/DolphinWX/Src/NetWindow.cpp index 0e17e70bae..0347385e73 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.cpp +++ b/Source/Core/DolphinWX/Src/NetWindow.cpp @@ -29,7 +29,6 @@ #define NETPLAY_TITLEBAR "Dolphin NetPlay" -DEFINE_EVENT_TYPE(wxEVT_THREAD) BEGIN_EVENT_TABLE(NetPlayDiag, wxFrame) EVT_COMMAND(wxID_ANY, wxEVT_THREAD, NetPlayDiag::OnThread) END_EVENT_TABLE() diff --git a/Source/Core/DolphinWX/Src/NetWindow.h b/Source/Core/DolphinWX/Src/NetWindow.h index 0e70d352e8..ae27a75921 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.h +++ b/Source/Core/DolphinWX/Src/NetWindow.h @@ -24,6 +24,7 @@ #include <string> #include <wx/wx.h> +#include <wx/event.h> #include <wx/sizer.h> #include <wx/dialog.h> #include <wx/notebook.h> @@ -114,8 +115,6 @@ private: static NetPlayDiag* npd; }; -DECLARE_EVENT_TYPE(wxEVT_THREAD, -1) - class ChangeGameDiag : public wxDialog { public: diff --git a/Source/Core/DolphinWX/Src/TASInputDlg.cpp b/Source/Core/DolphinWX/Src/TASInputDlg.cpp index 689681d199..65d17f6e03 100644 --- a/Source/Core/DolphinWX/Src/TASInputDlg.cpp +++ b/Source/Core/DolphinWX/Src/TASInputDlg.cpp @@ -371,5 +371,11 @@ void TASInputDlg::OnCloseWindow(wxCloseEvent& event) bool TASInputDlg::HasFocus() { - return (wxWindow::FindFocus() == this || wxWindow::FindFocus()->GetParent() == this); + if (wxWindow::FindFocus() == this) + return true; + else if (wxWindow::FindFocus() != NULL && + wxWindow::FindFocus()->GetParent() == this) + return true; + else + return false; } diff --git a/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp b/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp index 75252cdc67..b197109c33 100644 --- a/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/Src/VideoConfigDiag.cpp @@ -75,6 +75,7 @@ wxString adapter_desc = wxTRANSLATE("Select a hardware adapter to use.\n\nIf uns wxString display_res_desc = wxTRANSLATE("Selects the display resolution used in fullscreen mode.\nThis should always be bigger than or equal to the internal resolution. Performance impact is negligible.\n\nIf unsure, use your desktop resolution.\nIf still unsure, use the highest resolution which works for you."); wxString use_fullscreen_desc = wxTRANSLATE("Enable this if you want the whole screen to be used for rendering.\nIf this is disabled, a render window will be created instead.\n\nIf unsure, leave this unchecked."); wxString auto_window_size_desc = wxTRANSLATE("Automatically adjusts the window size to your internal resolution.\n\nIf unsure, leave this unchecked."); +wxString keep_window_on_top_desc = wxTRANSLATE("Keep the game window on top of all other windows.\n\nIf unsure, leave this unchecked."); wxString hide_mouse_cursor_desc = wxTRANSLATE("Hides the mouse cursor if it's on top of the emulation window.\n\nIf unsure, leave this checked."); wxString render_to_main_win_desc = wxTRANSLATE("Enable this if you want to use the main Dolphin window for rendering rather than a separate render window.\n\nIf unsure, leave this unchecked."); wxString prog_scan_desc = wxTRANSLATE("Enables progressive scan if supported by the emulated software.\nMost games don't care about this.\n\nIf unsure, leave this unchecked."); @@ -301,6 +302,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con SettingCheckBox* render_to_main_cb; szr_other->Add(CreateCheckBox(page_general, _("Show FPS"), wxGetTranslation(show_fps_desc), vconfig.bShowFPS)); szr_other->Add(CreateCheckBox(page_general, _("Auto adjust Window Size"), wxGetTranslation(auto_window_size_desc), SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderWindowAutoSize)); + szr_other->Add(CreateCheckBox(page_general, _("Keep window on top"), wxGetTranslation(keep_window_on_top_desc), SConfig::GetInstance().m_LocalCoreStartupParameter.bKeepWindowOnTop)); szr_other->Add(CreateCheckBox(page_general, _("Hide Mouse Cursor"), wxGetTranslation(hide_mouse_cursor_desc), SConfig::GetInstance().m_LocalCoreStartupParameter.bHideCursor)); szr_other->Add(render_to_main_cb = CreateCheckBox(page_general, _("Render to Main Window"), wxGetTranslation(render_to_main_win_desc), SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)); diff --git a/Source/Core/DolphinWX/Src/WXInputBase.cpp b/Source/Core/DolphinWX/Src/WXInputBase.cpp index 3ed7f60ecd..467371ae9c 100644 --- a/Source/Core/DolphinWX/Src/WXInputBase.cpp +++ b/Source/Core/DolphinWX/Src/WXInputBase.cpp @@ -43,7 +43,10 @@ const wxString WXKeyToString(int keycode) case WXK_CLEAR: return _("Clear"); case WXK_SHIFT: return wxT("Shift"); case WXK_ALT: return wxT("Alt"); - case WXK_CONTROL: return _("Control"); + case WXK_RAW_CONTROL: return _("Control"); +#ifdef __WXOSX__ + case WXK_COMMAND: return _("Command"); +#endif case WXK_MENU: return _("Menu"); case WXK_PAUSE: return _("Pause"); case WXK_CAPITAL: return _("Caps Lock"); @@ -131,7 +134,6 @@ const wxString WXKeyToString(int keycode) case WXK_WINDOWS_LEFT: return _("Windows Left"); case WXK_WINDOWS_RIGHT: return _("Windows Right"); case WXK_WINDOWS_MENU: return _("Windows Menu"); - case WXK_COMMAND: return _("Command"); } if (keycode > WXK_SPACE && keycode < WXK_DELETE) { |
