From 8e31ecd9c4409bfe492388d9b7b27089c7b7e273 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 01:31:32 +0200 Subject: [PATCH 01/26] Remove executable bit from source files --- desmume/src/GPU.cpp | 0 desmume/src/GPU.h | 0 desmume/src/NDSSystem.cpp | 0 desmume/src/NDSSystem.h | 0 desmume/src/OGLRender.cpp | 0 desmume/src/OGLRender.h | 0 desmume/src/OGLRender_3_2.cpp | 0 desmume/src/driver.h | 0 desmume/src/frontend/cocoa/AppIcon_DeSmuME.icns | Bin .../DeSmuME (XCode 3).xcodeproj/project.pbxproj | 0 .../cocoa/source-sans-pro/SIL Open Font License.txt | 0 .../cocoa/source-sans-pro/SourceSansPro-Black.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-BlackIt.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-Bold.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-BoldIt.otf | Bin .../source-sans-pro/SourceSansPro-ExtraLight.otf | Bin .../source-sans-pro/SourceSansPro-ExtraLightIt.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-It.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-Light.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-LightIt.otf | Bin .../cocoa/source-sans-pro/SourceSansPro-Regular.otf | Bin .../source-sans-pro/SourceSansPro-Semibold.otf | Bin .../source-sans-pro/SourceSansPro-SemiboldIt.otf | Bin desmume/src/frontend/posix/gtk-glade/callbacks.cpp | 0 desmume/src/frontend/posix/gtk-glade/callbacks.h | 0 .../src/frontend/posix/gtk-glade/callbacks_IO.cpp | 0 desmume/src/frontend/posix/gtk-glade/callbacks_IO.h | 0 .../posix/gtk-glade/dTools/callbacks_1_ioregs.cpp | 0 .../posix/gtk-glade/dTools/callbacks_2_memview.cpp | 0 .../posix/gtk-glade/dTools/callbacks_3_palview.cpp | 0 .../posix/gtk-glade/dTools/callbacks_4_tileview.cpp | 0 .../posix/gtk-glade/dTools/callbacks_dtools.h | 0 .../posix/gtk-glade/dTools/dTools_display.h | 0 desmume/src/frontend/posix/gtk-glade/desmume.cpp | 0 desmume/src/frontend/posix/gtk-glade/desmume.h | 0 desmume/src/frontend/posix/gtk-glade/gdk_gl.cpp | 0 desmume/src/frontend/posix/gtk-glade/gdk_gl.h | 0 desmume/src/frontend/posix/gtk-glade/glade-xml.cpp | 0 .../src/frontend/posix/gtk-glade/glade/DeSmuME.xpm | 0 .../frontend/posix/gtk-glade/glade/DeSmuMe.glade | 0 .../posix/gtk-glade/glade/DeSmuMe_Dtools.glade | 0 desmume/src/frontend/posix/gtk-glade/globals.h | 0 .../src/frontend/posix/gtk-glade/keyval_names.cpp | 0 desmume/src/frontend/posix/gtk-glade/keyval_names.h | 0 desmume/src/frontend/posix/gtk-glade/main.cpp | 0 desmume/src/frontend/windows/aviout.cpp | 0 desmume/src/frontend/windows/aviout.h | 0 desmume/src/frontend/windows/inputdx.cpp | 0 desmume/src/frontend/windows/main.cpp | 0 desmume/src/frontend/windows/ogl_display.cpp | 0 desmume/src/frontend/windows/ogl_display.h | 0 desmume/src/frontend/windows/resource.h | 0 desmume/src/frontend/windows/resources.rc | 0 desmume/src/frontend/windows/snddx.cpp | 0 desmume/src/frontend/windows/snddx.h | 0 desmume/src/frontend/windows/winpcap.h | 0 desmume/src/gfx3d.cpp | 0 desmume/src/matrix.cpp | 0 desmume/src/movie.cpp | 0 desmume/src/movie.h | 0 desmume/src/rasterize.cpp | 0 desmume/src/render3D.cpp | 0 desmume/src/types.h | 0 .../utils/colorspacehandler/colorspacehandler.cpp | 0 desmume/src/wifi.cpp | 0 desmume/src/wifi.h | 0 66 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 desmume/src/GPU.cpp mode change 100755 => 100644 desmume/src/GPU.h mode change 100755 => 100644 desmume/src/NDSSystem.cpp mode change 100755 => 100644 desmume/src/NDSSystem.h mode change 100755 => 100644 desmume/src/OGLRender.cpp mode change 100755 => 100644 desmume/src/OGLRender.h mode change 100755 => 100644 desmume/src/OGLRender_3_2.cpp mode change 100755 => 100644 desmume/src/driver.h mode change 100755 => 100644 desmume/src/frontend/cocoa/AppIcon_DeSmuME.icns mode change 100755 => 100644 desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SIL Open Font License.txt mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Black.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-BlackIt.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Bold.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-BoldIt.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-ExtraLight.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-ExtraLightIt.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-It.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Light.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-LightIt.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Regular.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Semibold.otf mode change 100755 => 100644 desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-SemiboldIt.otf mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/callbacks.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/callbacks.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/callbacks_IO.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/callbacks_IO.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/dTools/callbacks_1_ioregs.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/dTools/callbacks_2_memview.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/dTools/callbacks_3_palview.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/dTools/callbacks_4_tileview.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/dTools/callbacks_dtools.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/dTools/dTools_display.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/desmume.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/desmume.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/gdk_gl.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/gdk_gl.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/glade-xml.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/glade/DeSmuME.xpm mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/glade/DeSmuMe.glade mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/glade/DeSmuMe_Dtools.glade mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/globals.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/keyval_names.cpp mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/keyval_names.h mode change 100755 => 100644 desmume/src/frontend/posix/gtk-glade/main.cpp mode change 100755 => 100644 desmume/src/frontend/windows/aviout.cpp mode change 100755 => 100644 desmume/src/frontend/windows/aviout.h mode change 100755 => 100644 desmume/src/frontend/windows/inputdx.cpp mode change 100755 => 100644 desmume/src/frontend/windows/main.cpp mode change 100755 => 100644 desmume/src/frontend/windows/ogl_display.cpp mode change 100755 => 100644 desmume/src/frontend/windows/ogl_display.h mode change 100755 => 100644 desmume/src/frontend/windows/resource.h mode change 100755 => 100644 desmume/src/frontend/windows/resources.rc mode change 100755 => 100644 desmume/src/frontend/windows/snddx.cpp mode change 100755 => 100644 desmume/src/frontend/windows/snddx.h mode change 100755 => 100644 desmume/src/frontend/windows/winpcap.h mode change 100755 => 100644 desmume/src/gfx3d.cpp mode change 100755 => 100644 desmume/src/matrix.cpp mode change 100755 => 100644 desmume/src/movie.cpp mode change 100755 => 100644 desmume/src/movie.h mode change 100755 => 100644 desmume/src/rasterize.cpp mode change 100755 => 100644 desmume/src/render3D.cpp mode change 100755 => 100644 desmume/src/types.h mode change 100755 => 100644 desmume/src/utils/colorspacehandler/colorspacehandler.cpp mode change 100755 => 100644 desmume/src/wifi.cpp mode change 100755 => 100644 desmume/src/wifi.h diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/GPU.h b/desmume/src/GPU.h old mode 100755 new mode 100644 diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h old mode 100755 new mode 100644 diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/OGLRender.h b/desmume/src/OGLRender.h old mode 100755 new mode 100644 diff --git a/desmume/src/OGLRender_3_2.cpp b/desmume/src/OGLRender_3_2.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/driver.h b/desmume/src/driver.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/AppIcon_DeSmuME.icns b/desmume/src/frontend/cocoa/AppIcon_DeSmuME.icns old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj b/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SIL Open Font License.txt b/desmume/src/frontend/cocoa/source-sans-pro/SIL Open Font License.txt old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Black.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Black.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-BlackIt.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-BlackIt.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Bold.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Bold.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-BoldIt.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-BoldIt.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-ExtraLight.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-ExtraLight.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-ExtraLightIt.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-ExtraLightIt.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-It.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-It.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Light.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Light.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-LightIt.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-LightIt.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Regular.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Regular.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Semibold.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-Semibold.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-SemiboldIt.otf b/desmume/src/frontend/cocoa/source-sans-pro/SourceSansPro-SemiboldIt.otf old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/callbacks.cpp b/desmume/src/frontend/posix/gtk-glade/callbacks.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/callbacks.h b/desmume/src/frontend/posix/gtk-glade/callbacks.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/callbacks_IO.cpp b/desmume/src/frontend/posix/gtk-glade/callbacks_IO.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/callbacks_IO.h b/desmume/src/frontend/posix/gtk-glade/callbacks_IO.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_1_ioregs.cpp b/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_1_ioregs.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_2_memview.cpp b/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_2_memview.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_3_palview.cpp b/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_3_palview.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_4_tileview.cpp b/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_4_tileview.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_dtools.h b/desmume/src/frontend/posix/gtk-glade/dTools/callbacks_dtools.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/dTools/dTools_display.h b/desmume/src/frontend/posix/gtk-glade/dTools/dTools_display.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/desmume.cpp b/desmume/src/frontend/posix/gtk-glade/desmume.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/desmume.h b/desmume/src/frontend/posix/gtk-glade/desmume.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/gdk_gl.cpp b/desmume/src/frontend/posix/gtk-glade/gdk_gl.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/gdk_gl.h b/desmume/src/frontend/posix/gtk-glade/gdk_gl.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/glade-xml.cpp b/desmume/src/frontend/posix/gtk-glade/glade-xml.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/glade/DeSmuME.xpm b/desmume/src/frontend/posix/gtk-glade/glade/DeSmuME.xpm old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/glade/DeSmuMe.glade b/desmume/src/frontend/posix/gtk-glade/glade/DeSmuMe.glade old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/glade/DeSmuMe_Dtools.glade b/desmume/src/frontend/posix/gtk-glade/glade/DeSmuMe_Dtools.glade old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/globals.h b/desmume/src/frontend/posix/gtk-glade/globals.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/keyval_names.cpp b/desmume/src/frontend/posix/gtk-glade/keyval_names.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/keyval_names.h b/desmume/src/frontend/posix/gtk-glade/keyval_names.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/posix/gtk-glade/main.cpp b/desmume/src/frontend/posix/gtk-glade/main.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/aviout.cpp b/desmume/src/frontend/windows/aviout.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/aviout.h b/desmume/src/frontend/windows/aviout.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/inputdx.cpp b/desmume/src/frontend/windows/inputdx.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/main.cpp b/desmume/src/frontend/windows/main.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/ogl_display.cpp b/desmume/src/frontend/windows/ogl_display.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/ogl_display.h b/desmume/src/frontend/windows/ogl_display.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/resource.h b/desmume/src/frontend/windows/resource.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/resources.rc b/desmume/src/frontend/windows/resources.rc old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/snddx.cpp b/desmume/src/frontend/windows/snddx.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/snddx.h b/desmume/src/frontend/windows/snddx.h old mode 100755 new mode 100644 diff --git a/desmume/src/frontend/windows/winpcap.h b/desmume/src/frontend/windows/winpcap.h old mode 100755 new mode 100644 diff --git a/desmume/src/gfx3d.cpp b/desmume/src/gfx3d.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/matrix.cpp b/desmume/src/matrix.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/movie.cpp b/desmume/src/movie.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/movie.h b/desmume/src/movie.h old mode 100755 new mode 100644 diff --git a/desmume/src/rasterize.cpp b/desmume/src/rasterize.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/render3D.cpp b/desmume/src/render3D.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/types.h b/desmume/src/types.h old mode 100755 new mode 100644 diff --git a/desmume/src/utils/colorspacehandler/colorspacehandler.cpp b/desmume/src/utils/colorspacehandler/colorspacehandler.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/wifi.cpp b/desmume/src/wifi.cpp old mode 100755 new mode 100644 diff --git a/desmume/src/wifi.h b/desmume/src/wifi.h old mode 100755 new mode 100644 From 2a5150ff7da0944b111a4ebd5fe90c6e8b00d506 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 03:43:23 +0200 Subject: [PATCH 02/26] GTK: Add missing include when neither OSMesa nor GLX are enabled --- desmume/src/frontend/posix/gtk-glade/main.cpp | 2 ++ desmume/src/frontend/posix/gtk/main.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/desmume/src/frontend/posix/gtk-glade/main.cpp b/desmume/src/frontend/posix/gtk-glade/main.cpp index 4b16980b3..796bfb0d6 100644 --- a/desmume/src/frontend/posix/gtk-glade/main.cpp +++ b/desmume/src/frontend/posix/gtk-glade/main.cpp @@ -21,6 +21,8 @@ * Boston, MA 02111-1307, USA. */ +#include + #include "callbacks.h" #include "callbacks_IO.h" #include "dTools/callbacks_dtools.h" diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 7216798ab..a7fc2cba2 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "types.h" #include "firmware.h" From 6823aed6dd626417d0aa175b2f47e2416af2dcc9 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 04:09:04 +0200 Subject: [PATCH 03/26] GTK: Add a meson build system --- desmume/src/frontend/posix/cli/meson.build | 24 ++ .../src/frontend/posix/gtk-glade/meson.build | 45 ++++ desmume/src/frontend/posix/gtk/meson.build | 38 +++ desmume/src/frontend/posix/meson.build | 250 ++++++++++++++++++ desmume/src/frontend/posix/meson_options.txt | 20 ++ 5 files changed, 377 insertions(+) create mode 100644 desmume/src/frontend/posix/cli/meson.build create mode 100644 desmume/src/frontend/posix/gtk-glade/meson.build create mode 100644 desmume/src/frontend/posix/gtk/meson.build create mode 100644 desmume/src/frontend/posix/meson.build create mode 100644 desmume/src/frontend/posix/meson_options.txt diff --git a/desmume/src/frontend/posix/cli/meson.build b/desmume/src/frontend/posix/cli/meson.build new file mode 100644 index 000000000..6f731fb46 --- /dev/null +++ b/desmume/src/frontend/posix/cli/meson.build @@ -0,0 +1,24 @@ +dep_x11 = dependency('x11') + +cli_dependencies = dependencies + [dep_x11] + +cli_src = [ + 'main.cpp', + '../shared/sndsdl.cpp', + '../shared/ctrlssdl.cpp', +] + +# TODO: why do we have to redeclare it here with one more fs level? +includes = [ + '../../../../src', + '../../../../src/libretro-common/include', + '../../../../src/frontend', +] + +executable('desmume-cli', + cli_src, + dependencies: cli_dependencies, + include_directories: includes, + link_with: libdesmume, + install: true, +) diff --git a/desmume/src/frontend/posix/gtk-glade/meson.build b/desmume/src/frontend/posix/gtk-glade/meson.build new file mode 100644 index 000000000..adce936f9 --- /dev/null +++ b/desmume/src/frontend/posix/gtk-glade/meson.build @@ -0,0 +1,45 @@ +dep_gtk2 = dependency('gtk+-2.0') +dep_glade = dependency('libglade-2.0') +dep_gmodule = dependency('gmodule-2.0') +dep_gtkglext = dependency('gtkglext-1.0') +dep_x11 = dependency('x11') + +gtk_dependencies = dependencies + [dep_gtk2, dep_glade, dep_gmodule, dep_gtkglext, dep_x11] + +desmume_src = [ + 'glade-xml.cpp', + 'callbacks.cpp', + 'callbacks_IO.cpp', + 'desmume.cpp', + 'keyval_names.cpp', + 'main.cpp', + 'gdk_gl.cpp', + 'dTools/callbacks_1_ioregs.cpp', + 'dTools/callbacks_2_memview.cpp', + 'dTools/callbacks_3_palview.cpp', + 'dTools/callbacks_4_tileview.cpp', + 'gdk_3Demu.cpp', + '../shared/sndsdl.cpp', + '../shared/ctrlssdl.cpp', + '../../../driver.cpp', +] + +# TODO: why do we have to redeclare it here with one more fs level? +includes = [ + '../../../../src', + '../../../../src/libretro-common/include', + '../../../../src/frontend', +] + +executable('desmume-glade', + desmume_src, + cpp_args: ['-DGETTEXT_PACKAGE="desmume"', '-DLOCALEDIR="' + get_option('localedir') + '"', '-DVERSION="Unknown version"', '-DGTKGLEXT_AVAILABLE'], + dependencies: gtk_dependencies, + include_directories: includes, + link_with: libdesmume, + install: true, +) + +install_data('desmume-glade.desktop', install_dir: get_option('datadir') / 'applications') +install_data('glade/DeSmuME.xpm', install_dir: get_option('datadir') / 'pixmaps') +install_data(['glade/DeSmuMe_Dtools.glade', 'glade/DeSmuMe.glade', 'glade/DeSmuME.xpm'], install_dir: get_option('datadir') / 'glade') diff --git a/desmume/src/frontend/posix/gtk/meson.build b/desmume/src/frontend/posix/gtk/meson.build new file mode 100644 index 000000000..ace673ddc --- /dev/null +++ b/desmume/src/frontend/posix/gtk/meson.build @@ -0,0 +1,38 @@ +dep_gtk2 = dependency('gtk+-2.0') +dep_x11 = dependency('x11') + +gtk_dependencies = dependencies + [dep_gtk2, dep_x11] + +desmume_src = [ + 'avout_pipe_base.cpp', + 'avout_x264.cpp', + 'avout_flac.cpp', + 'config.cpp', + 'desmume.cpp', + 'dToolsList.cpp', + 'tools/ioregsView.cpp', + '../shared/sndsdl.cpp', + '../shared/ctrlssdl.cpp', + 'osmesa_3Demu.cpp', + 'glx_3Demu.cpp', + 'cheatsGTK.cpp', + 'main.cpp', +] + +# TODO: why do we have to redeclare it here with one more fs level? +includes = [ + '../../../../src', + '../../../../src/libretro-common/include', + '../../../../src/frontend', +] + +executable('desmume', + desmume_src, + dependencies: gtk_dependencies, + include_directories: includes, + link_with: libdesmume, + install: true, +) + +install_data('desmume.desktop', install_dir: get_option('datadir') / 'applications') +install_data('DeSmuME.xpm', install_dir: get_option('datadir') / 'pixmaps') diff --git a/desmume/src/frontend/posix/meson.build b/desmume/src/frontend/posix/meson.build new file mode 100644 index 000000000..7bf4ee8d6 --- /dev/null +++ b/desmume/src/frontend/posix/meson.build @@ -0,0 +1,250 @@ +project('desmume', + ['c', 'cpp'], + version: '2.7.10', + meson_version: '>=0.54', + default_options: [ + 'warning_level=0', + 'c_std=c11', + 'cpp_std=c++14', + ], + license: 'GPL2+', +) + +dep_glib2 = dependency('glib-2.0') +dep_sdl = dependency('sdl') +dep_pcap = dependency('pcap') +dep_zlib = dependency('zlib') +dep_gl = dependency('gl', required: false) +dep_openal = dependency('openal', required: get_option('openal')) +dep_alsa = dependency('alsa', required: false) +dep_soundtouch = dependency('soundtouch', required: false) +dep_agg = dependency('libagg', required: false) + +# XXX: something wrong with this one. +#dep_lua = dependency('lua-5.1', required: false) + +if get_option('wifi') + add_global_arguments('-DEXPERIMENTAL_WIFI_COMM') +endif + +dependencies = [dep_glib2, dep_sdl, dep_pcap, dep_zlib] + +if target_machine.cpu() == 'x86_64' + add_global_arguments('-DHAVE_JIT', language: ['c', 'cpp']) + add_global_arguments('-DHOST_64', language: ['c', 'cpp']) + have_jit = true +elif target_machine.cpu() == 'i686' + add_global_arguments('-DHAVE_JIT', language: ['c', 'cpp']) + add_global_arguments('-DHOST_32', language: ['c', 'cpp']) + have_jit = true +else + have_jit = false +endif + +includes = [ + '../../../src', + '../../../src/libretro-common/include', + '../../../src/frontend', +] + +libdesmume_src = [ + '../../armcpu.cpp', + '../../arm_instructions.cpp', + '../../bios.cpp', + '../../cp15.cpp', + '../../commandline.cpp', + '../../common.cpp', + '../../debug.cpp', + '../../driver.cpp', + '../../Database.cpp', + '../../emufile.cpp', '../../encrypt.cpp', '../../FIFO.cpp', + '../../firmware.cpp', '../../GPU.cpp', + '../../mc.cpp', + '../../path.cpp', + '../../readwrite.cpp', + '../../wifi.cpp', + '../../MMU.cpp', '../../NDSSystem.cpp', + '../../ROMReader.cpp', + '../../render3D.cpp', + '../../rtc.cpp', + '../../saves.cpp', + '../../slot1.cpp', + '../../slot2.cpp', + '../../SPU.cpp', + '../../matrix.cpp', + '../../gfx3d.cpp', + '../../thumb_instructions.cpp', + '../../movie.cpp', + '../../frontend/modules/Disassembler.cpp', + '../../utils/advanscene.cpp', + '../../utils/datetime.cpp', + '../../utils/guid.cpp', + '../../utils/emufat.cpp', + '../../utils/fsnitro.cpp', + '../../utils/xstring.cpp', + '../../utils/decrypt/crc.cpp', '../../utils/decrypt/decrypt.cpp', + '../../utils/decrypt/header.cpp', + '../../utils/task.cpp', + '../../utils/vfat.cpp', + '../../utils/dlditool.cpp', + '../../utils/libfat/cache.cpp', + '../../utils/libfat/directory.cpp', + '../../utils/libfat/disc.cpp', + '../../utils/libfat/fatdir.cpp', + '../../utils/libfat/fatfile.cpp', + '../../utils/libfat/filetime.cpp', + '../../utils/libfat/file_allocation_table.cpp', + '../../utils/libfat/libfat.cpp', + '../../utils/libfat/libfat_public_api.cpp', + '../../utils/libfat/lock.cpp', + '../../utils/libfat/partition.cpp', + '../../utils/tinyxml/tinystr.cpp', + '../../utils/tinyxml/tinyxml.cpp', + '../../utils/tinyxml/tinyxmlerror.cpp', + '../../utils/tinyxml/tinyxmlparser.cpp', + '../../utils/colorspacehandler/colorspacehandler.cpp', + '../../addons/slot2_auto.cpp', '../../addons/slot2_mpcf.cpp', '../../addons/slot2_paddle.cpp', '../../addons/slot2_gbagame.cpp', '../../addons/slot2_none.cpp', '../../addons/slot2_rumblepak.cpp', '../../addons/slot2_guitarGrip.cpp', '../../addons/slot2_expMemory.cpp', '../../addons/slot2_piano.cpp', '../../addons/slot2_passme.cpp', '../../addons/slot1_none.cpp', '../../addons/slot1_r4.cpp', '../../addons/slot1_retail_nand.cpp', '../../addons/slot1_retail_auto.cpp', '../../addons/slot1_retail_mcrom.cpp', '../../addons/slot1_retail_mcrom_debug.cpp', '../../addons/slot1comp_mc.cpp', '../../addons/slot1comp_rom.cpp', '../../addons/slot1comp_protocol.cpp', + '../../cheatSystem.cpp', + '../../texcache.cpp', '../../rasterize.cpp', + '../../metaspu/metaspu.cpp', + '../../filter/2xsai.cpp', '../../filter/bilinear.cpp', '../../filter/deposterize.cpp', '../../filter/epx.cpp', + '../../filter/hq2x.cpp', + '../../filter/hq3x.cpp', + '../../filter/hq4x.cpp', + '../../filter/lq2x.cpp', '../../filter/scanline.cpp', + '../../filter/videofilter.cpp', + '../../filter/xbrz.cpp', + '../../version.cpp', + '../../libretro-common/compat/compat_getopt.c', + '../../libretro-common/file/file_path.c', + '../../libretro-common/compat/compat_strl.c', + '../../libretro-common/features/features_cpu.c', + '../../libretro-common/file/retro_dirent.c', + '../../libretro-common/file/retro_stat.c', + '../../libretro-common/rthreads/async_job.c', + '../../libretro-common/rthreads/rsemaphore.c', + '../../libretro-common/rthreads/rthreads.c', + '../../libretro-common/encodings/encoding_utf.c', +] + +if have_jit + libdesmume_src += [ + '../../arm_jit.cpp', + '../../utils/AsmJit/core/assembler.cpp', + '../../utils/AsmJit/core/assert.cpp', + '../../utils/AsmJit/core/buffer.cpp', + '../../utils/AsmJit/core/compiler.cpp', + '../../utils/AsmJit/core/compilercontext.cpp', + '../../utils/AsmJit/core/compilerfunc.cpp', + '../../utils/AsmJit/core/compileritem.cpp', + '../../utils/AsmJit/core/context.cpp', + '../../utils/AsmJit/core/cpuinfo.cpp', + '../../utils/AsmJit/core/defs.cpp', + '../../utils/AsmJit/core/func.cpp', + '../../utils/AsmJit/core/logger.cpp', + '../../utils/AsmJit/core/memorymanager.cpp', + '../../utils/AsmJit/core/memorymarker.cpp', + '../../utils/AsmJit/core/operand.cpp', + '../../utils/AsmJit/core/stringbuilder.cpp', + '../../utils/AsmJit/core/stringutil.cpp', + '../../utils/AsmJit/core/virtualmemory.cpp', + '../../utils/AsmJit/core/zonememory.cpp', + '../../utils/AsmJit/x86/x86assembler.cpp', + '../../utils/AsmJit/x86/x86compiler.cpp', + '../../utils/AsmJit/x86/x86compilercontext.cpp', + '../../utils/AsmJit/x86/x86compilerfunc.cpp', + '../../utils/AsmJit/x86/x86compileritem.cpp', + '../../utils/AsmJit/x86/x86cpuinfo.cpp', + '../../utils/AsmJit/x86/x86defs.cpp', + '../../utils/AsmJit/x86/x86func.cpp', + '../../utils/AsmJit/x86/x86operand.cpp', + '../../utils/AsmJit/x86/x86util.cpp', + ] +endif + +libdesmume_src += [ + 'shared/desmume_config.cpp', +] + +if dep_gl.found() + dependencies += dep_gl + add_global_arguments('-DHAVE_GL_GLX', language: ['c', 'cpp']) + libdesmume_src += [ + '../../OGLRender.cpp', + '../../OGLRender_3_2.cpp', + ] +endif + +if dep_openal.found() + dependencies += dep_openal + libdesmume_src += [ + 'shared/mic_openal.cpp', + ] +elif dep_alsa.found() + dependencies += dep_alsa + libdesmume_src += [ + 'shared/mic_alsa.cpp', + ] +else + libdesmume_src += [ + '../../mic.cpp', + ] +endif + +if dep_soundtouch.found() + dependencies += dep_soundtouch + libdesmume_src += [ + '../../metaspu/SndOut.cpp', + '../../metaspu/Timestretcher.cpp', + ] +endif + +if dep_agg.found() + dependencies += dep_agg + add_global_arguments('-DHAVE_LIBAGG', language: ['c', 'cpp']) + libdesmume_src += [ + '../modules/osd/agg/aggdraw.cpp', + '../modules/osd/agg/agg_osd.cpp', + ] +endif + +# TODO: fix Lua on ¬Windows. +#if dep_lua.found() +# dependencies += dep_lua +# libdesmume_src += [ +# '../../lua-engine.cpp', +# ] +#endif + +if get_option('gdb-stub') + libdesmume_src += [ + '../../gdbstub/gdbstub.cpp', + ] +endif + +simd = import('unstable-simd') +cxx = meson.get_compiler('cpp') +rval = simd.check('colorspacehandler', + sse2: '../../utils/colorspacehandler/colorspacehandler_SSE2.cpp', + # TODO: add these two even in generic builds. + #avx2: '../../utils/colorspacehandler/colorspacehandler_AVX2.cpp', + #avx512: '../../utils/colorspacehandler/colorspacehandler_AVX512.cpp', + # TODO: add support for this in meson. + #altivec: '../../utils/colorspacehandler/colorspacehandler_AltiVec.cpp', + compiler: cxx, + include_directories: includes, +) +colorspacehandler_simd = rval[0] + +libdesmume = static_library('desmume', + libdesmume_src, + dependencies: dependencies, + include_directories: includes, + link_with: colorspacehandler_simd, +) + +subdir('cli') +subdir('gtk') +if get_option('glade') + subdir('gtk-glade') +endif diff --git a/desmume/src/frontend/posix/meson_options.txt b/desmume/src/frontend/posix/meson_options.txt new file mode 100644 index 000000000..1a3b3d3bd --- /dev/null +++ b/desmume/src/frontend/posix/meson_options.txt @@ -0,0 +1,20 @@ +option('openal', + type: 'boolean', + value: false, + description: 'Enable experimental OpenAL microphone input', +) +option('glade', + type: 'boolean', + value: false, + description: 'Enable glade frontend', +) +option('wifi', + type: 'boolean', + value: false, + description: 'Enable wifi support', +) +option('gdb-stub', + type: 'boolean', + value: false, + description: 'Enable gdb stub', +) From 70733a55b4c4ec269eea545162d50dc783dd6c53 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 04:34:39 +0200 Subject: [PATCH 04/26] GTK: Switch to gtk3 instead of gtk2 All deprecation warnings are disabled for now, they will be reenabled at a later point. --- desmume/src/frontend/posix/gtk/meson.build | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/meson.build b/desmume/src/frontend/posix/gtk/meson.build index ace673ddc..39d74e528 100644 --- a/desmume/src/frontend/posix/gtk/meson.build +++ b/desmume/src/frontend/posix/gtk/meson.build @@ -1,7 +1,7 @@ -dep_gtk2 = dependency('gtk+-2.0') +dep_gtk3 = dependency('gtk+-3.0') dep_x11 = dependency('x11') -gtk_dependencies = dependencies + [dep_gtk2, dep_x11] +gtk_dependencies = dependencies + [dep_gtk3, dep_x11] desmume_src = [ 'avout_pipe_base.cpp', @@ -28,6 +28,7 @@ includes = [ executable('desmume', desmume_src, + cpp_args: ['-DGDK_DISABLE_DEPRECATION_WARNINGS'], dependencies: gtk_dependencies, include_directories: includes, link_with: libdesmume, From 3927aa442280ede47e49050b8697ff7694017e94 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 04:37:23 +0200 Subject: [PATCH 05/26] GTK: Rename GDK keys to their new name --- desmume/src/frontend/posix/gtk/main.cpp | 44 ++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index a7fc2cba2..14ea2137a 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -637,21 +637,21 @@ GPU3DInterface *core3DList[] = { int multisampleSizes[] = {0, 2, 4, 8, 16, 32}; static const u16 gtk_kb_cfg[NB_KEYS] = { - GDK_x, // A - GDK_z, // B - GDK_Shift_R, // select - GDK_Return, // start - GDK_Right, // Right - GDK_Left, // Left - GDK_Up, // Up - GDK_Down, // Down - GDK_w, // R - GDK_q, // L - GDK_s, // X - GDK_a, // Y - GDK_p, // DEBUG - GDK_o, // BOOST - GDK_BackSpace, // Lid + GDK_KEY_x, // A + GDK_KEY_z, // B + GDK_KEY_Shift_R, // select + GDK_KEY_Return, // start + GDK_KEY_Right, // Right + GDK_KEY_Left, // Left + GDK_KEY_Up, // Up + GDK_KEY_Down, // Down + GDK_KEY_w, // R + GDK_KEY_q, // L + GDK_KEY_s, // X + GDK_KEY_a, // Y + GDK_KEY_p, // DEBUG + GDK_KEY_o, // BOOST + GDK_KEY_BackSpace, // Lid }; GKeyFile *keyfile; @@ -1867,19 +1867,19 @@ static void MenuSave(GtkMenuItem *item, gpointer slot) static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) { - if (e->keyval == GDK_Shift_L){ + if (e->keyval == GDK_KEY_Shift_L){ gdk_shift_pressed |= 1; return 1; } - if (e->keyval == GDK_Shift_R){ + if (e->keyval == GDK_KEY_Shift_R){ gdk_shift_pressed |= 2; return 1; } - if( e->keyval >= GDK_F1 && e->keyval <= GDK_F10 ){ + if( e->keyval >= GDK_KEY_F1 && e->keyval <= GDK_KEY_F10 ){ if(!gdk_shift_pressed) - loadgame((e->keyval - GDK_F1 + 1) % 10); + loadgame((e->keyval - GDK_KEY_F1 + 1) % 10); else - savegame((e->keyval - GDK_F1 + 1) % 10); + savegame((e->keyval - GDK_KEY_F1 + 1) % 10); return 1; } guint mask; @@ -1903,11 +1903,11 @@ static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) static gint Key_Release(GtkWidget *w, GdkEventKey *e, gpointer data) { - if (e->keyval == GDK_Shift_L){ + if (e->keyval == GDK_KEY_Shift_L){ gdk_shift_pressed &= ~1; return 1; } - if (e->keyval == GDK_Shift_R){ + if (e->keyval == GDK_KEY_Shift_R){ gdk_shift_pressed &= ~2; return 1; } From cdbad3d05a070fa102de6f47d22dc7ca8ee68e2b Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 04:43:30 +0200 Subject: [PATCH 06/26] =?UTF-8?q?GTK:=20Fetch=20dialogs=E2=80=99=20content?= =?UTF-8?q?=20area=20with=20the=20relevant=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- desmume/src/frontend/posix/gtk/main.cpp | 42 ++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 14ea2137a..1d8f4671f 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -1934,8 +1934,8 @@ static void SetAudioVolume() hscale = gtk_hscale_new_with_range(0, SDL_MIX_MAXVOLUME, 1); gtk_range_set_value(GTK_RANGE(hscale), SNDSDLGetAudioVolume()); g_signal_connect(G_OBJECT(hscale), "value-changed", G_CALLBACK(CallbackSetAudioVolume), NULL); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hscale, TRUE, FALSE, 0); - gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hscale, TRUE, FALSE, 0); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); switch(gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_OK: @@ -1972,9 +1972,9 @@ static void SetFirmwareLanguage() check_button = gtk_check_button_new_with_mnemonic("_Enable command line overriding"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), config.command_line_overriding_firmware_language); g_signal_connect(G_OBJECT(check_button), "toggled", G_CALLBACK(CallbackSetFirmwareLanguage), combo_box_text); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), check_button, TRUE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), combo_box_text, TRUE, FALSE, 0); - gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), check_button, TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), combo_box_text, TRUE, FALSE, 0); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); switch(gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_OK: @@ -2026,11 +2026,11 @@ static void Modify_Key(GtkWidget* widget, gpointer data) ctx.label = gtk_label_new(Title); g_free(Title); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mkDialog)->vbox), ctx.label, TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(mkDialog))), ctx.label, TRUE, FALSE, 0); g_signal_connect(G_OBJECT(mkDialog), "key_press_event", G_CALLBACK(AcceptNewInputKey), &ctx); - gtk_widget_show_all(GTK_DIALOG(mkDialog)->vbox); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(mkDialog))); switch(gtk_dialog_run(GTK_DIALOG(mkDialog))) { case GTK_RESPONSE_OK: @@ -2070,10 +2070,10 @@ static void Edit_Controls() ecKey = gtk_button_new_with_label(Key_Label); g_free(Key_Label); g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_Key), GINT_TO_POINTER(i)); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(ecDialog))), ecKey,TRUE, FALSE, 0); } - gtk_widget_show_all(GTK_DIALOG(ecDialog)->vbox); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(ecDialog))); switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: @@ -2121,8 +2121,8 @@ static void Modify_JoyKey(GtkWidget* widget, gpointer data) ctx.label = gtk_label_new(Title); g_free(Title); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mkDialog)->vbox), ctx.label, TRUE, FALSE, 0); - gtk_widget_show_all(GTK_DIALOG(mkDialog)->vbox); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(mkDialog))), ctx.label, TRUE, FALSE, 0); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(mkDialog))); g_signal_connect(G_OBJECT(mkDialog), "focus_in_event", G_CALLBACK(AcceptNewJoyKey), &ctx); @@ -2157,21 +2157,21 @@ static void EmulationSettingsDialog(){ NULL); esKey=gtk_label_new("CPU Mode:\n"); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(esDialog)->vbox), esKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); esKey=gtk_check_button_new_with_label("Use dynamic recompiler"); gtk_toggle_button_set_active((GtkToggleButton*)esKey,config.use_jit); g_signal_connect(G_OBJECT(esKey),"clicked",G_CALLBACK(ToggleJIT),GINT_TO_POINTER(0)); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(esDialog)->vbox), esKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); esKey=gtk_label_new("Block Size (1 - accuracy, 100 - fastest):"); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(esDialog)->vbox), esKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); GtkAdjustment* JITBlockSizeAdjustment=(GtkAdjustment*)gtk_adjustment_new(config.jit_max_block_size,1,100,1,5,0); esKey=gtk_hscale_new(JITBlockSizeAdjustment); gtk_scale_set_digits((GtkScale*)esKey,0); g_signal_connect(G_OBJECT(JITBlockSizeAdjustment),"value_changed",G_CALLBACK(JITMaxBlockSizeChanged),NULL); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(esDialog)->vbox), esKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); esKey=gtk_label_new( "Enabling this will get you 0-50% speedups. It is optional because it\n" @@ -2181,9 +2181,9 @@ static void EmulationSettingsDialog(){ "\n" "This should not be assumed to be deterministic." ); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(esDialog)->vbox), esKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); - gtk_widget_show_all(GTK_DIALOG(esDialog)->vbox); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))); bool prev_use_jit=config.use_jit; int prev_jit_max_block_size=config.jit_max_block_size; @@ -2235,10 +2235,10 @@ static void Edit_Joystick_Controls() ecKey = gtk_button_new_with_label(Key_Label); g_free(Key_Label); g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_JoyKey), GINT_TO_POINTER(i)); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(ecDialog))), ecKey,TRUE, FALSE, 0); } - gtk_widget_show_all(GTK_DIALOG(ecDialog)->vbox); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(ecDialog))); switch (gtk_dialog_run(GTK_DIALOG(ecDialog))) { case GTK_RESPONSE_OK: @@ -2269,7 +2269,7 @@ static void GraphicsSettingsDialog() { wTable = gtk_table_new(2 ,2, TRUE); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(gsDialog)->vbox), wTable, TRUE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gsDialog))), wTable, TRUE, FALSE, 0); // 3D Core gsKey = gtk_label_new("3D Core:"); @@ -2359,7 +2359,7 @@ static void GraphicsSettingsDialog() { static_cast(GTK_EXPAND | GTK_FILL), 10, 0); - gtk_widget_show_all(GTK_DIALOG(gsDialog)->vbox); + gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(gsDialog))); switch (gtk_dialog_run(GTK_DIALOG(gsDialog))) { case GTK_RESPONSE_OK: From 87c2377c6ab4078b4825ebcae53d151916bf2cc4 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 04:45:38 +0200 Subject: [PATCH 07/26] =?UTF-8?q?GTK:=20Fetch=20widget=E2=80=99s=20window?= =?UTF-8?q?=20with=20the=20relevant=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At this point, this version builds. It is full of deprecated widgets and functions though, which will have to be cleaned over time. It also doesn’t display any visuals in the DS emulation part yet. --- desmume/src/frontend/posix/gtk/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 1d8f4671f..1e2473172 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -1768,7 +1768,7 @@ static gboolean Stylus_Move(GtkWidget *w, GdkEventMotion *e, gpointer data) if(click) { if(e->is_hint) - gdk_window_get_pointer(w->window, &x, &y, &state); + gdk_window_get_pointer(gtk_widget_get_window(w), &x, &y, &state); else { x= (gint)e->x; y= (gint)e->y; @@ -1804,7 +1804,7 @@ static gboolean Stylus_Press(GtkWidget * w, GdkEventButton * e, } if (e->button == 1) { - gdk_window_get_pointer(w->window, &x, &y, &state); + gdk_window_get_pointer(gtk_widget_get_window(w), &x, &y, &state); if(state & GDK_BUTTON1_MASK) { #ifdef HAVE_LIBAGG From 89f5e500393145b07a7d186ce974b0663c38ddf8 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 20:53:06 +0200 Subject: [PATCH 08/26] GTK: Use accessor to retrieve GtkAdjustment value --- desmume/src/frontend/posix/gtk/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 1e2473172..1ffd61399 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -2205,7 +2205,7 @@ static void EmulationSettingsDialog(){ } static void JITMaxBlockSizeChanged(GtkAdjustment* adj,void * nullPtr){ - config.jit_max_block_size=(int)adj->value; + config.jit_max_block_size=(int)gtk_adjustment_get_value(adj); } static void ToggleJIT(){ From 81f0ded5b601b2986fa8a84f0a3bb42ad7d49a9c Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 12:33:49 +0200 Subject: [PATCH 09/26] GTK: Restore drawing capability The expose_event signal has been renamed draw. --- desmume/src/frontend/posix/gtk/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 1ffd61399..bb4920751 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -3439,7 +3439,7 @@ common_gtk_main( class configured_features *my_config) G_CALLBACK(Stylus_Release), NULL); g_signal_connect(G_OBJECT(pDrawingArea), "motion_notify_event", G_CALLBACK(Stylus_Move), NULL); - g_signal_connect(G_OBJECT(pDrawingArea), "expose_event", + g_signal_connect(G_OBJECT(pDrawingArea), "draw", G_CALLBACK(ExposeDrawingArea), NULL ) ; g_signal_connect(G_OBJECT(pDrawingArea), "configure_event", G_CALLBACK(ConfigureDrawingArea), NULL ) ; From e808897c47eabe1a4b54edb458efb976cae54249 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 12:34:43 +0200 Subject: [PATCH 10/26] GTK: Reenable deprecation warnings At this point we got a fully (?) functional gtk3 port, but it uses a ton of deprecated functions that will be removed in gtk4. Better enable the warnings so that we know what to fix before then. --- desmume/src/frontend/posix/gtk/meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/desmume/src/frontend/posix/gtk/meson.build b/desmume/src/frontend/posix/gtk/meson.build index 39d74e528..a920416b9 100644 --- a/desmume/src/frontend/posix/gtk/meson.build +++ b/desmume/src/frontend/posix/gtk/meson.build @@ -28,7 +28,6 @@ includes = [ executable('desmume', desmume_src, - cpp_args: ['-DGDK_DISABLE_DEPRECATION_WARNINGS'], dependencies: gtk_dependencies, include_directories: includes, link_with: libdesmume, From 4c53f6296795c8edd2f2594edfcb01705b9648c0 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 05:12:59 +0200 Subject: [PATCH 11/26] GTK: Remove deprecated gtk_widget_modify_bg() If we want to change the style of a widget, we should use CSS nowadays. --- desmume/src/frontend/posix/gtk/main.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index bb4920751..e68ba72b2 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -901,9 +901,6 @@ static void ToggleFullscreen(GtkToggleAction *action) config.window_fullscreen = gtk_toggle_action_get_active(action); if (config.window_fullscreen) { - GdkColor black = {0, 0, 0, 0}; - gtk_widget_modify_bg(pDrawingArea, GTK_STATE_NORMAL, &black); - gtk_widget_hide(pMenuBar); gtk_widget_hide(pToolBar); gtk_widget_hide(pStatusBar); @@ -914,8 +911,6 @@ static void ToggleFullscreen(GtkToggleAction *action) } else { - gtk_widget_modify_bg(pDrawingArea, GTK_STATE_NORMAL, NULL); - if (config.view_menu) { gtk_widget_show(pMenuBar); } From eabfcb71be1bbe061a6657307b2ed46b836a9703 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 12:39:03 +0200 Subject: [PATCH 12/26] GTK: Replace deprecated GtkVBox/GtkHBox with GtkBox --- desmume/src/frontend/posix/gtk/cheatsGTK.cpp | 26 +++++++++---------- desmume/src/frontend/posix/gtk/main.cpp | 16 ++++++------ .../frontend/posix/gtk/tools/ioregsView.cpp | 24 ++++++++--------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/cheatsGTK.cpp b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp index 6045bdfdb..6b82ce6bf 100644 --- a/desmume/src/frontend/posix/gtk/cheatsGTK.cpp +++ b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp @@ -305,13 +305,13 @@ static GtkWidget *cheat_list_create_ui() { GtkListStore *store = cheat_list_populate(); GtkWidget *tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); - GtkWidget *vbox = gtk_vbox_new(FALSE, 1); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); GtkWidget *hbbox = gtk_hbutton_box_new(); GtkWidget *button; - gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(tree)); - gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hbbox)); - gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); + gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(tree)); + gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(hbbox)); + gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(box)); button = gtk_button_new_with_label("add cheat"); g_signal_connect (button, "clicked", G_CALLBACK (cheat_list_add_cheat), store); @@ -352,15 +352,15 @@ void CheatList () static void cheat_search_create_ui() { GtkWidget *button; - GtkWidget *vbox = gtk_vbox_new(FALSE, 1); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); GtkWidget *hbbox = gtk_hbutton_box_new(); GtkWidget *b; - gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); + gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(box)); { - b = gtk_hbox_new(FALSE, 1); - gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b)); + b = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); + gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(b)); { GtkTreeModel * size_model; @@ -381,8 +381,8 @@ static void cheat_search_create_ui() gtk_container_add(GTK_CONTAINER(b), w); } - b = gtk_hbox_new(FALSE, 1); - gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(b)); + b = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); + gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(b)); { GtkWidget *w; @@ -407,7 +407,7 @@ static void cheat_search_create_ui() // BUTTONS: - gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hbbox)); + gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(hbbox)); button = gtk_button_new_with_label("add cheats"); // g_signal_connect (button, "clicked", g_callback (cheat_list_add_cheat), store); @@ -417,8 +417,8 @@ static void cheat_search_create_ui() // g_signal_connect (button, "clicked", g_callback (cheat_list_add_cheat), store); gtk_container_add(GTK_CONTAINER(hbbox),button); -// GtkWidget *vbox = gtk_vbox_new(FALSE, 1); -// gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); +// GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); +// gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(box)); } static void cheatSearchEnd() diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index e68ba72b2..d1c3fec09 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -3119,7 +3119,7 @@ common_gtk_main( class configured_features *my_config) SDL_TimerID limiter_timer = NULL; GtkAccelGroup * accel_group; - GtkWidget *pVBox; + GtkWidget *pBox; GtkWidget *pMenuBar; GtkWidget *pToolBar; @@ -3270,9 +3270,9 @@ common_gtk_main( class configured_features *my_config) g_signal_connect(G_OBJECT(pWindow), "key_press_event", G_CALLBACK(Key_Press), NULL); g_signal_connect(G_OBJECT(pWindow), "key_release_event", G_CALLBACK(Key_Release), NULL); - /* Create the GtkVBox */ - pVBox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(pWindow), pVBox); + /* Create the GtkBox */ + pBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add(GTK_CONTAINER(pWindow), pBox); ui_manager = gtk_ui_manager_new (); accel_group = gtk_accel_group_new(); @@ -3401,9 +3401,9 @@ common_gtk_main( class configured_features *my_config) desmume_try_adding_ui(ui_manager, ui_description); pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); - gtk_box_pack_start (GTK_BOX (pVBox), pMenuBar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(pBox), pMenuBar, FALSE, FALSE, 0); pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); - gtk_box_pack_start (GTK_BOX(pVBox), pToolBar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(pBox), pToolBar, FALSE, FALSE, 0); { GtkWidget * recentMenu = gtk_ui_manager_get_widget (ui_manager, "/MainMenu/FileMenu/RecentMenu"); @@ -3421,7 +3421,7 @@ common_gtk_main( class configured_features *my_config) /* This toggle action must not be set active before the pDrawingArea initialization to avoid a GTK warning */ gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "gap"), config.view_gap); - gtk_container_add (GTK_CONTAINER (pVBox), pDrawingArea); + gtk_container_add (GTK_CONTAINER(pBox), pDrawingArea); gtk_widget_set_events(pDrawingArea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | @@ -3442,7 +3442,7 @@ common_gtk_main( class configured_features *my_config) /* Status bar */ pStatusBar = gtk_statusbar_new(); UpdateStatusBar(EMU_DESMUME_NAME_AND_VERSION()); - gtk_box_pack_end(GTK_BOX(pVBox), pStatusBar, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(pBox), pStatusBar, FALSE, FALSE, 0); gtk_widget_show_all(pWindow); diff --git a/desmume/src/frontend/posix/gtk/tools/ioregsView.cpp b/desmume/src/frontend/posix/gtk/tools/ioregsView.cpp index c338470c4..f54249aa5 100644 --- a/desmume/src/frontend/posix/gtk/tools/ioregsView.cpp +++ b/desmume/src/frontend/posix/gtk/tools/ioregsView.cpp @@ -41,7 +41,7 @@ BOOL CPUS [2] = {TRUE, TRUE}; static GtkWidget *mWin[2]; -static GtkWidget *mVbox0[2]; +static GtkWidget *mBox0[2]; static GtkWidget *mIoRegCombo[2]; static GtkWidget *mRegInfos[2]; @@ -68,11 +68,11 @@ static reg_t *current_reg[2] = {NULL, NULL}; char _bit_check_buf[64]; \ snprintf(_bit_check_buf, ARRAY_SIZE(_bit_check_buf), "Bit %d: %s", n,s); \ _wl_[w] = gtk_check_button_new_with_label(_bit_check_buf ); \ - gtk_box_pack_start(GTK_BOX(mVbox0[c]), _wl_[w], FALSE, FALSE, 0); } + gtk_box_pack_start(GTK_BOX(mBox0[c]), _wl_[w], FALSE, FALSE, 0); } #define BIT_COMBO(w,n,s) { \ - _wl_[w] = gtk_hbox_new(FALSE, 0); \ - gtk_box_pack_start(GTK_BOX(mVbox0[c]), _wl_[w], FALSE, FALSE, 0); } \ + _wl_[w] = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); \ + gtk_box_pack_start(GTK_BOX(mBox0[c]), _wl_[w], FALSE, FALSE, 0); } \ char _bit_combo_buf[64]; \ snprintf(_bit_combo_buf, ARRAY_SIZE(_bit_combo_buf), "Bits %s: %s", n,s); \ GtkWidget *__combo_lbl_tmp = gtk_label_new(_bit_combo_buf); \ @@ -380,11 +380,11 @@ static void selected_reg(GtkWidget* widget, gpointer data) guint active = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); if(current_reg[c]) current_reg[c]->destroy(c); - gtk_container_foreach(GTK_CONTAINER(mVbox0[c]), _clearContainer, (gpointer)mVbox0[c]); + gtk_container_foreach(GTK_CONTAINER(mBox0[c]), _clearContainer, (gpointer)mBox0[c]); current_reg[c] = (reg_t*)&(GET_REG_LIST(c)[active]); -// gtk_box_pack_start(GTK_BOX(mVbox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); +// gtk_box_pack_start(GTK_BOX(mBox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); switch (current_reg[c]->size) { case BITS_8: @@ -396,7 +396,7 @@ static void selected_reg(GtkWidget* widget, gpointer data) default: regInfosBuffer = g_strdup_printf("0x%08X", current_reg[c]->value(c)); } -// gtk_box_pack_start(GTK_BOX(mVbox0[c]), mRegInfos[c], FALSE, FALSE, 0); +// gtk_box_pack_start(GTK_BOX(mBox0[c]), mRegInfos[c], FALSE, FALSE, 0); gtk_label_set_label(GTK_LABEL(mRegInfos[c]), regInfosBuffer); g_free(regInfosBuffer); @@ -424,7 +424,7 @@ static void _closeOne(GtkWidget *widget, gpointer data) gtk_widget_destroy(mRegInfos[c]); gtk_widget_destroy(mIoRegCombo[c]); - gtk_widget_destroy(mVbox0[c]); + gtk_widget_destroy(mBox0[c]); // gtk_widget_destroy(mWin[c]); } @@ -454,8 +454,8 @@ static void open(int ID) else gtk_window_set_title(GTK_WINDOW(mWin[c]), TOOL_NAME " : ARM7"); g_signal_connect(G_OBJECT(mWin[c]), "destroy", G_CALLBACK(&_closeOne), GINT_TO_POINTER(c)); - mVbox0[c] = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(mWin[c]), mVbox0[c]); + mBox0[c] = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add(GTK_CONTAINER(mWin[c]), mBox0[c]); mIoRegCombo[c] = gtk_combo_box_text_new(); mRegInfos[c] = gtk_label_new(""); @@ -471,8 +471,8 @@ static void open(int ID) gtk_combo_box_set_active(GTK_COMBO_BOX(mIoRegCombo[c]), 0); g_signal_connect(G_OBJECT(mIoRegCombo[c]), "changed", G_CALLBACK(selected_reg), GINT_TO_POINTER(c)); - gtk_box_pack_start(GTK_BOX(mVbox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(mVbox0[c]), mRegInfos[c], FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(mBox0[c]), mIoRegCombo[c], FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(mBox0[c]), mRegInfos[c], FALSE, FALSE, 0); selected_reg(mIoRegCombo[c], GINT_TO_POINTER(c)); gtk_widget_show_all(mWin[c]); From c1efe4f4750bc6194f13e7fc8d898baf76997e79 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 13:01:38 +0200 Subject: [PATCH 13/26] GTK: Remove usage of deprecated GtkMisc --- desmume/src/frontend/posix/gtk/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index d1c3fec09..f8f4feb6a 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -2268,7 +2268,7 @@ static void GraphicsSettingsDialog() { // 3D Core gsKey = gtk_label_new("3D Core:"); - gtk_misc_set_alignment(GTK_MISC(gsKey), 0.0, 0.5); + gtk_label_set_yalign(GTK_LABEL(gsKey), 0.5); gtk_table_attach(GTK_TABLE(wTable), gsKey, 0, 1, 0, 1, static_cast(GTK_EXPAND | GTK_FILL), static_cast(GTK_EXPAND | GTK_FILL), 5, 0); @@ -2287,7 +2287,7 @@ static void GraphicsSettingsDialog() { // 3D Texture Upscaling gsKey = gtk_label_new("3D Texture Upscaling:"); - gtk_misc_set_alignment(GTK_MISC(gsKey), 0.0, 0.5); + gtk_label_set_yalign(GTK_LABEL(gsKey), 0.5); gtk_table_attach(GTK_TABLE(wTable), gsKey, 0, 1, 1, 2, static_cast(GTK_EXPAND | GTK_FILL), static_cast(GTK_EXPAND | GTK_FILL), 5, 0); @@ -2323,7 +2323,7 @@ static void GraphicsSettingsDialog() { #ifdef HAVE_OPENGL // OpenGL Multisample gsKey = gtk_label_new("Multisample Antialiasing (OpenGL):"); - gtk_misc_set_alignment(GTK_MISC(gsKey), 0.0, 0.5); + gtk_label_set_yalign(GTK_LABEL(gsKey), 0.5); gtk_table_attach(GTK_TABLE(wTable), gsKey, 0, 1, 4, 5, static_cast(GTK_EXPAND | GTK_FILL), static_cast(GTK_EXPAND | GTK_FILL), 5, 0); From cc9d7a14508acf822f76153df90b8c64626f4da3 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 12:26:35 +0200 Subject: [PATCH 14/26] GTK: Replace GtkFileChooserDialog with GtkFileChooserNative MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This one uses the native file chooser the user is used to, which can be GTK’s on Linux but a more familiar one on other OSes. If xdg-desktop-portal is installed, it can even use the DE’s native one on Linux. --- desmume/src/frontend/posix/gtk/main.cpp | 242 ++++++++---------------- 1 file changed, 80 insertions(+), 162 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index f8f4feb6a..5f9834562 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -977,15 +977,11 @@ void Pause() static void LoadStateDialog() { GtkFileFilter *pFilter_ds, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); gtk_file_filter_set_name(pFilter_ds, "DeSmuME binary (.ds*)"); @@ -995,26 +991,22 @@ static void LoadStateDialog() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Load State From ...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Load State From ...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, - NULL); - - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); + "_Open", "_Cancel"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_ds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); if(savestate_load(sPath) == false ) { - GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1026,25 +1018,18 @@ static void LoadStateDialog() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void RecordMovieDialog() { GtkFileFilter *pFilter_dsm, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); gtk_file_filter_set_name(pFilter_dsm, "DeSmuME movie file (.dsm*)"); @@ -1054,31 +1039,25 @@ static void RecordMovieDialog() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Save Movie To ...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Save Movie To ...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, - NULL); + "_Save", "_Cancel"); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsm); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); + FCEUI_SaveMovie(sPath,L"",START_BLANK,"", FCEUI_MovieGetRTCDefault()); g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void StopMovie() @@ -1089,15 +1068,11 @@ static void StopMovie() static void PlayMovieDialog() { GtkFileFilter *pFilter_dsm, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); gtk_file_filter_set_name(pFilter_dsm, "DeSmuME movie file (.dsm*)"); @@ -1107,47 +1082,36 @@ static void PlayMovieDialog() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Play movie from...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Play movie from...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, - NULL); + "_Open", "_Cancel"); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsm); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); FCEUI_LoadMovie(sPath,true,false,-1); g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void SaveStateDialog() { GtkFileFilter *pFilter_ds, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); gtk_file_filter_set_name(pFilter_ds, "DeSmuME binary (.ds*)"); @@ -1157,27 +1121,23 @@ static void SaveStateDialog() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Save State To ...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Save State To ...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, - NULL); + "_Save", "_Cancel"); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_ds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); if(savestate_save(sPath) == false ) { - GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1189,25 +1149,18 @@ static void SaveStateDialog() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void RecordAV_x264() { GtkFileFilter *pFilter_mkv, *pFilter_mp4, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_mkv = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_mkv, "*.mkv"); gtk_file_filter_set_name(pFilter_mkv, "Matroska (.mkv)"); @@ -1221,30 +1174,26 @@ static void RecordAV_x264() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Save video...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Save video...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, - NULL); + "_Save", "_Cancel"); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_mkv); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_mp4); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); if(avout_x264.begin(sPath)) { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_x264"), FALSE); } else { - GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1254,25 +1203,18 @@ static void RecordAV_x264() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void RecordAV_flac() { GtkFileFilter *pFilter_flac, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_flac = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_flac, "*.flac"); gtk_file_filter_set_name(pFilter_flac, "FLAC file (.flac)"); @@ -1282,29 +1224,25 @@ static void RecordAV_flac() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Save audio...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Save audio...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, - NULL); + "_Save", "_Cancel"); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE); - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_flac); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); if(avout_flac.begin(sPath)) { gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_flac"), FALSE); } else { - GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1314,11 +1252,8 @@ static void RecordAV_flac() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void RecordAV_stop() { @@ -1331,15 +1266,11 @@ static void RecordAV_stop() { static void OpenNdsDialog() { GtkFileFilter *pFilter_nds, *pFilter_dsgba, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS]"); #ifdef HAVE_LIBZ @@ -1359,14 +1290,10 @@ static void OpenNdsDialog() gtk_file_filter_set_name(pFilter_any, "All files"); /* Creating the selection window */ - pFileSelection = gtk_file_chooser_dialog_new("Open...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Open...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, - NULL); - /* Only the dialog window is accepting events: */ - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); + "_Open", "_Cancel"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_nds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_dsgba); @@ -1375,11 +1302,13 @@ static void OpenNdsDialog() gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(pFileSelection), g_get_home_dir()); /* Showing the window */ - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); + if(Open((const char*)sPath) < 0) { - GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1406,11 +1335,8 @@ static void OpenNdsDialog() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) @@ -2525,15 +2451,11 @@ static void Printscreen() static void SelectFirmwareFile() { GtkFileFilter *pFilter_nds, *pFilter_bin, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; BOOL oldState = desmume_running(); Pause(); - pParent = GTK_WIDGET(pWindow); - pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.nds"); gtk_file_filter_set_name(pFilter_nds, "Nds binary (.nds)"); @@ -2546,29 +2468,25 @@ static void SelectFirmwareFile() gtk_file_filter_add_pattern(pFilter_any, "*"); gtk_file_filter_set_name(pFilter_any, "All files"); - pFileSelection = gtk_file_chooser_dialog_new("Load firmware...", - GTK_WINDOW(pParent), + pFileSelection = gtk_file_chooser_native_new("Load firmware...", + GTK_WINDOW(pWindow), GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, - NULL); - gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE); + "_Open", "_Cancel"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_nds); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_bin); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileSelection), pFilter_any); - switch(gtk_dialog_run(GTK_DIALOG(pFileSelection))) { - case GTK_RESPONSE_OK: - sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection)); + int response = gtk_native_dialog_run(GTK_NATIVE_DIALOG(pFileSelection)); + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(pFileSelection)); + gchar *sPath = g_file_get_path(file); + CommonSettings.UseExtFirmware = true; strncpy(CommonSettings.ExtFirmwarePath, (const char*)sPath, g_utf8_strlen(sPath, -1)); g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); if(oldState) Launch(); } From 13b5c0fd0183ad18263494265e37fd69094143c9 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 14:21:43 +0200 Subject: [PATCH 15/26] GTK: Migrate from gtk_main() to GtkApplication This will make it possible to use GAction to replace the deprecated GtkAction and GtkToggleAction and such. --- desmume/src/frontend/posix/gtk/main.cpp | 64 ++++++++++++------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 5f9834562..11966de44 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -830,7 +831,7 @@ struct nds_screen_t { struct nds_screen_t nds_screen; -static BOOL regMainLoop = FALSE; +static guint regMainLoop = 0; static inline void UpdateStatusBar (const char *message) { @@ -946,8 +947,7 @@ void Launch() desmume_resume(); if(!regMainLoop) { - g_idle_add_full(EMULOOP_PRIO, &EmuLoop, pWindow, NULL); - regMainLoop = TRUE; + regMainLoop = g_idle_add_full(EMULOOP_PRIO, &EmuLoop, pWindow, NULL); } UpdateStatusBar("Running ..."); @@ -2611,7 +2611,11 @@ public: static void DoQuit() { emu_halt(EMUHALT_REASON_USER_REQUESTED_HALT, NDSErrorTag_None); - gtk_main_quit(); + if (regMainLoop) { + g_source_remove(regMainLoop); + regMainLoop = 0; + } + gtk_window_close(GTK_WINDOW(pWindow)); } @@ -2630,7 +2634,10 @@ gboolean EmuLoop(gpointer data) frame_mod3 = 0; gtk_window_set_title(GTK_WINDOW(pWindow), "DeSmuME - Paused"); fps_SecStart = 0; - regMainLoop = FALSE; + if (regMainLoop) { + g_source_remove(regMainLoop); + regMainLoop = 0; + } RedrawScreen(); return FALSE; } @@ -3027,9 +3034,11 @@ static gboolean timeout_exit_cb(gpointer data) return FALSE; } -static int -common_gtk_main( class configured_features *my_config) +static void +common_gtk_main(GApplication *app, gpointer user_data) { + configured_features *my_config = static_cast(user_data); + config.load(); driver = new GtkDriver(); @@ -3111,7 +3120,8 @@ common_gtk_main( class configured_features *my_config) if(SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) == -1) { g_printerr("Error trying to initialize SDL: %s\n", SDL_GetError()); - return 1; + // TODO: return a non-zero exit status. + g_application_quit(app); } desmume_init( my_config->disable_sound || !config.audio_enabled); @@ -3164,7 +3174,9 @@ common_gtk_main( class configured_features *my_config) #endif /* Initialize joysticks */ - if(!init_joy()) return 1; + if(!init_joy()) + // TODO: return a non-zero exit status. + g_application_quit(app); dTools_running = (BOOL*)malloc(sizeof(BOOL) * dTools_list_size); if (dTools_running != NULL) @@ -3183,6 +3195,7 @@ common_gtk_main( class configured_features *my_config) gtk_window_set_title(GTK_WINDOW(pWindow), "DeSmuME"); gtk_window_set_resizable(GTK_WINDOW (pWindow), TRUE); gtk_window_set_icon(GTK_WINDOW (pWindow), gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm)); + gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW(pWindow)); g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(DoQuit), NULL); g_signal_connect(G_OBJECT(pWindow), "key_press_event", G_CALLBACK(Key_Press), NULL); @@ -3495,9 +3508,9 @@ common_gtk_main( class configured_features *my_config) video->SetFilterParameteri(VF_PARAM_SCANLINE_D, _scanline_filter_d); RedrawScreen(); - /* Main loop */ - gtk_main(); +} +static void Teardown() { delete video; config.save(); @@ -3528,11 +3541,8 @@ common_gtk_main( class configured_features *my_config) gdbstub_mutex_destroy(); #endif - - return EXIT_SUCCESS; } - int main (int argc, char *argv[]) { configured_features my_config; @@ -3550,7 +3560,9 @@ int main (int argc, char *argv[]) fprintf(stderr, "Warning: X11 not thread-safe\n"); } - gtk_init(&argc, &argv); + // TODO: pass G_APPLICATION_HANDLES_COMMAND_LINE instead. + GtkApplication *app = gtk_application_new("org.desmume.DeSmuME", G_APPLICATION_FLAGS_NONE); + g_signal_connect (app, "activate", G_CALLBACK(common_gtk_main), &my_config); if ( !fill_configured_features( &my_config, argv)) { exit(0); @@ -3562,23 +3574,7 @@ int main (int argc, char *argv[]) arm_jit_sync(); arm_jit_reset(CommonSettings.use_jit); #endif - return common_gtk_main( &my_config); + int ret = g_application_run(G_APPLICATION(app), argc, argv); + Teardown(); + return ret; } - -#ifdef WIN32 -int WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) -{ - int argc = 0; - char *argv[] = NULL; - - /* - * FIXME: - * Emulate the argc and argv main parameters. Could do this using - * CommandLineToArgvW and then convert the wide chars to thin chars. - * Or parse the wide chars directly and call common_gtk_main with a - * filled configuration structure. - */ - main( argc, argv); -} -#endif - From d680c4be51889ee6962208d1af695ffb3b0d1281 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 23:23:02 +0200 Subject: [PATCH 16/26] GTK: Use modern GDK accessors to its Cairo context --- desmume/src/frontend/posix/gtk/main.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 11966de44..7caeff758 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -1557,7 +1557,8 @@ static gboolean ExposeDrawingArea (GtkWidget *widget, GdkEventExpose *event, gpo hratio = MIN(hratio, vratio); vratio = hratio; - cairo_t* cr = gdk_cairo_create(window); + GdkDrawingContext *context = gdk_window_begin_draw_frame(window, gdk_window_get_clip_region(window)); + cairo_t* cr = gdk_drawing_context_get_cairo_context(context); // Scale to window size at center of area cairo_translate(cr, daW / 2, daH / 2); @@ -1583,7 +1584,7 @@ static gboolean ExposeDrawingArea (GtkWidget *widget, GdkEventExpose *event, gpo cairo_matrix_scale(&nds_screen.touch_matrix, (double)dstScale / 2, (double)dstScale / 2); cairo_matrix_invert(&nds_screen.touch_matrix); - cairo_destroy(cr); + gdk_window_end_draw_frame(window, context); draw_count++; return TRUE; From 96bc8977bdf7d2ddd0a144f398c73ffac3892abd Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 30 Aug 2020 00:09:31 +0200 Subject: [PATCH 17/26] GTK: Replace GtkTable with GtkGrid, in a UI string --- desmume/src/frontend/posix/gtk/main.cpp | 217 +++++++++++++++--------- 1 file changed, 137 insertions(+), 80 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 7caeff758..ff2350bc8 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -512,6 +512,113 @@ static const GtkRadioActionEntry rotation_entries[] = { { "rotate_270", "gtk-orientation-reverse-landscape", "_270",NULL, NULL, 270 }, }; +static const char *graphics_settings = +"" +"" +" " +" " +" " +" " +" 3D Core:" +" " +" " +" 0" +" 0" +" " +" " +" " +" " +" " +" Null" +" SoftRasterizer" +" OpenGL" +" " +" " +" " +" 1" +" 0" +" " +" " +" " +" " +" 3D Texture Upscaling:" +" " +" " +" 0" +" 1" +" " +" " +" " +" " +" " +" ×1" +" ×2" +" ×4" +" " +" " +" " +" 1" +" 1" +" " +" " +" " +" " +" 3D Texture Deposterization" +" True" +" " +" " +" 0" +" 2" +" " +" " +" " +" " +" 3D Texture Smoothing" +" True" +" " +" " +" 0" +" 3" +" " +" " +" " +" " +" High Resolution Color Interpolation (SoftRasterizer)" +" True" +" " +" " +" 1" +" 3" +" " +" " +" " +" " +" Multisample Antialiasing (OpenGL):" +" " +" " +" 0" +" 4" +" " +" " +" " +" " +" " +" None" +" 2" +" 4" +" 8" +" 16" +" 32" +" " +" " +" " +" 1" +" 4" +" " +" " +" " +""; + enum winsize_enum { WINSIZE_SCALE = 0, WINSIZE_HALF = 1, @@ -2178,7 +2285,10 @@ static void Edit_Joystick_Controls() static void GraphicsSettingsDialog() { GtkWidget *gsDialog; - GtkWidget *gsKey, *coreCombo, *wTable, *wPosterize, *wScale, *wSmoothing, *wMultisample, *wHCInterpolate; + GtkBox *wBox; + GtkGrid *wGrid; + GtkComboBox *coreCombo, *wScale, *wMultisample; + GtkToggleButton *wPosterize, *wSmoothing, *wHCInterpolate; gsDialog = gtk_dialog_new_with_buttons("Graphics Settings", GTK_WINDOW(pWindow), @@ -2189,97 +2299,44 @@ static void GraphicsSettingsDialog() { GTK_RESPONSE_CANCEL, NULL); + GtkBuilder *builder = gtk_builder_new_from_string(graphics_settings, -1); + wBox = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gsDialog))); + wGrid = GTK_GRID(gtk_builder_get_object(builder, "graphics_grid")); + gtk_box_pack_start(wBox, GTK_WIDGET(wGrid), TRUE, FALSE, 0); + coreCombo = GTK_COMBO_BOX(gtk_builder_get_object(builder, "core_combo")); + wScale = GTK_COMBO_BOX(gtk_builder_get_object(builder, "scale")); + wMultisample = GTK_COMBO_BOX(gtk_builder_get_object(builder, "multisample")); + wPosterize = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "posterize")); + wSmoothing = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "smoothing")); + wHCInterpolate = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "hc_interpolate")); + g_object_unref(builder); - wTable = gtk_table_new(2 ,2, TRUE); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gsDialog))), wTable, TRUE, FALSE, 0); - - // 3D Core - gsKey = gtk_label_new("3D Core:"); - gtk_label_set_yalign(GTK_LABEL(gsKey), 0.5); - gtk_table_attach(GTK_TABLE(wTable), gsKey, 0, 1, 0, 1, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 5, 0); - - coreCombo = gtk_combo_box_text_new(); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(coreCombo), 0, "Null"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(coreCombo), 1, "SoftRasterizer"); -#ifdef HAVE_OPENGL - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(coreCombo), 2, "OpenGL"); +#ifndef HAVE_OPENGL + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(coreCombo), 2); + gtk_grid_remove_row(wGrid, 4); #endif - gtk_combo_box_set_active(GTK_COMBO_BOX(coreCombo), cur3DCore); - gtk_table_attach(GTK_TABLE(wTable), coreCombo, 1, 2, 0, 1, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 5, 0); - - - // 3D Texture Upscaling - gsKey = gtk_label_new("3D Texture Upscaling:"); - gtk_label_set_yalign(GTK_LABEL(gsKey), 0.5); - gtk_table_attach(GTK_TABLE(wTable), gsKey, 0, 1, 1, 2, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 5, 0); - - wScale = gtk_combo_box_text_new(); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wScale), 0, "x1"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wScale), 1, "x2"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wScale), 2, "x4"); + gtk_combo_box_set_active(coreCombo, cur3DCore); // The shift it work for scale up to 4. For scaling more than 4, a mapping function is required - gtk_combo_box_set_active(GTK_COMBO_BOX(wScale), CommonSettings.GFX3D_Renderer_TextureScalingFactor >> 1); - gtk_table_attach(GTK_TABLE(wTable), wScale, 1, 2, 1, 2, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 5, 0); - + gtk_combo_box_set_active(wScale, CommonSettings.GFX3D_Renderer_TextureScalingFactor >> 1); // 3D Texture Deposterization - wPosterize = gtk_check_button_new_with_label("3D Texture Deposterization"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wPosterize), CommonSettings.GFX3D_Renderer_TextureDeposterize); - gtk_table_attach(GTK_TABLE(wTable), wPosterize, 0, 1, 2, 3, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 0, 0); - + gtk_toggle_button_set_active(wPosterize, CommonSettings.GFX3D_Renderer_TextureDeposterize); // 3D Texture Smoothing - wSmoothing = gtk_check_button_new_with_label("3D Texture Smoothing"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wSmoothing), CommonSettings.GFX3D_Renderer_TextureSmoothing); - gtk_table_attach(GTK_TABLE(wTable), wSmoothing, 0, 1, 3, 4, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 0, 0); - + gtk_toggle_button_set_active(wSmoothing, CommonSettings.GFX3D_Renderer_TextureSmoothing); #ifdef HAVE_OPENGL // OpenGL Multisample - gsKey = gtk_label_new("Multisample Antialiasing (OpenGL):"); - gtk_label_set_yalign(GTK_LABEL(gsKey), 0.5); - gtk_table_attach(GTK_TABLE(wTable), gsKey, 0, 1, 4, 5, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 5, 0); - - wMultisample = gtk_combo_box_text_new(); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wMultisample), 0, "None"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wMultisample), 1, "2"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wMultisample), 2, "4"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wMultisample), 3, "8"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wMultisample), 4, "16"); - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(wMultisample), 5, "32"); - int currentMultisample = CommonSettings.GFX3D_Renderer_MultisampleSize; int currentActive = 0; // find smallest option that is larger than current value, i.e. round up to power of 2 while (multisampleSizes[currentActive] < currentMultisample && currentActive < 5) { currentActive++; } - gtk_combo_box_set_active(GTK_COMBO_BOX(wMultisample), currentActive); - gtk_table_attach(GTK_TABLE(wTable), wMultisample, 1, 2, 4, 5, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 5, 0); + gtk_combo_box_set_active(wMultisample, currentActive); #endif // SoftRasterizer High Color Interpolation - wHCInterpolate = gtk_check_button_new_with_label("High Resolution Color Interpolation (SoftRasterizer)"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wHCInterpolate), CommonSettings.GFX3D_HighResolutionInterpolateColor); - gtk_table_attach(GTK_TABLE(wTable), wHCInterpolate, 1, 2, 3, 4, - static_cast(GTK_EXPAND | GTK_FILL), - static_cast(GTK_EXPAND | GTK_FILL), 10, 0); - + gtk_toggle_button_set_active(wHCInterpolate, CommonSettings.GFX3D_HighResolutionInterpolateColor); gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(gsDialog))); @@ -2287,7 +2344,7 @@ static void GraphicsSettingsDialog() { case GTK_RESPONSE_OK: // Start: OK Response block { - int sel3DCore = gtk_combo_box_get_active(GTK_COMBO_BOX(coreCombo)); + int sel3DCore = gtk_combo_box_get_active(coreCombo); // Change only if needed if (sel3DCore != cur3DCore) @@ -2323,7 +2380,7 @@ static void GraphicsSettingsDialog() { size_t scale = 1; - switch (gtk_combo_box_get_active(GTK_COMBO_BOX(wScale))){ + switch (gtk_combo_box_get_active(wScale)){ case 1: scale = 2; break; @@ -2333,12 +2390,12 @@ static void GraphicsSettingsDialog() { default: break; } - CommonSettings.GFX3D_Renderer_TextureDeposterize = config.textureDeposterize = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wPosterize)); - CommonSettings.GFX3D_Renderer_TextureSmoothing = config.textureSmoothing = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wSmoothing)); + CommonSettings.GFX3D_Renderer_TextureDeposterize = config.textureDeposterize = gtk_toggle_button_get_active(wPosterize); + CommonSettings.GFX3D_Renderer_TextureSmoothing = config.textureSmoothing = gtk_toggle_button_get_active(wSmoothing); CommonSettings.GFX3D_Renderer_TextureScalingFactor = config.textureUpscale = scale; - CommonSettings.GFX3D_HighResolutionInterpolateColor = config.highColorInterpolation = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wHCInterpolate)); + CommonSettings.GFX3D_HighResolutionInterpolateColor = config.highColorInterpolation = gtk_toggle_button_get_active(wHCInterpolate); #ifdef HAVE_OPENGL - int selectedMultisample = gtk_combo_box_get_active(GTK_COMBO_BOX(wMultisample)); + int selectedMultisample = gtk_combo_box_get_active(wMultisample); config.multisamplingSize = multisampleSizes[selectedMultisample]; config.multisampling = selectedMultisample != 0; CommonSettings.GFX3D_Renderer_MultisampleSize = multisampleSizes[selectedMultisample]; From 2423a9bb5e1b5c050e3c23f077a96097de7ab656 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 30 Aug 2020 00:11:14 +0200 Subject: [PATCH 18/26] GTK: Replace stock texts with their actual string --- desmume/src/frontend/posix/gtk/main.cpp | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index ff2350bc8..3c3d618ff 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -1959,7 +1959,7 @@ static void SetAudioVolume() GtkWidget *dialog = NULL; GtkWidget *hscale = NULL; int audio_volume = SNDSDLGetAudioVolume(); - dialog = gtk_dialog_new_with_buttons("Set audio volume", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); + dialog = gtk_dialog_new_with_buttons("Set audio volume", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, "_OK", GTK_RESPONSE_OK, "_Cancel", GTK_RESPONSE_CANCEL, NULL); hscale = gtk_hscale_new_with_range(0, SDL_MIX_MAXVOLUME, 1); gtk_range_set_value(GTK_RANGE(hscale), SNDSDLGetAudioVolume()); g_signal_connect(G_OBJECT(hscale), "value-changed", G_CALLBACK(CallbackSetAudioVolume), NULL); @@ -1992,7 +1992,7 @@ static void SetFirmwareLanguage() GtkWidget *check_button = NULL; const char *languages[6] = {"Japanese", "English", "French", "German", "Italian", "Spanish"}; gchar *text = NULL; - dialog = gtk_dialog_new_with_buttons("Set firmware language", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); + dialog = gtk_dialog_new_with_buttons("Set firmware language", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, "_OK", GTK_RESPONSE_OK, "_Cancel", GTK_RESPONSE_CANCEL, NULL); combo_box_text = gtk_combo_box_text_new(); for(int index = 0; index < 6; index++) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box_text), languages[index]); @@ -2049,8 +2049,8 @@ static void Modify_Key(GtkWidget* widget, gpointer data) mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, - GTK_STOCK_OK,GTK_RESPONSE_OK, - GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + "_OK",GTK_RESPONSE_OK, + "_Cancel",GTK_RESPONSE_CANCEL, NULL); ctx.label = gtk_label_new(Title); @@ -2090,8 +2090,8 @@ static void Edit_Controls() ecDialog = gtk_dialog_new_with_buttons("Edit controls", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, - GTK_STOCK_OK,GTK_RESPONSE_OK, - GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + "_OK",GTK_RESPONSE_OK, + "_Cancel",GTK_RESPONSE_CANCEL, NULL); for(i = 0; i < NB_KEYS; i++) { @@ -2144,8 +2144,8 @@ static void Modify_JoyKey(GtkWidget* widget, gpointer data) mkDialog = gtk_dialog_new_with_buttons(Title, GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, - GTK_STOCK_OK,GTK_RESPONSE_OK, - GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + "_OK",GTK_RESPONSE_OK, + "_Cancel",GTK_RESPONSE_CANCEL, NULL); ctx.label = gtk_label_new(Title); @@ -2181,8 +2181,8 @@ static void EmulationSettingsDialog(){ esDialog=gtk_dialog_new_with_buttons("Emulation Settings", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, - GTK_STOCK_OK,GTK_RESPONSE_OK, - GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + "_OK",GTK_RESPONSE_OK, + "_Cancel",GTK_RESPONSE_CANCEL, NULL); esKey=gtk_label_new("CPU Mode:\n"); @@ -2255,8 +2255,8 @@ static void Edit_Joystick_Controls() ecDialog = gtk_dialog_new_with_buttons("Edit controls", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, - GTK_STOCK_OK,GTK_RESPONSE_OK, - GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + "_OK",GTK_RESPONSE_OK, + "_Cancel",GTK_RESPONSE_CANCEL, NULL); for(i = 0; i < NB_KEYS; i++) { @@ -2293,9 +2293,9 @@ static void GraphicsSettingsDialog() { gsDialog = gtk_dialog_new_with_buttons("Graphics Settings", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, - GTK_STOCK_OK, + "_OK", GTK_RESPONSE_OK, - GTK_STOCK_CANCEL, + "_Cancel", GTK_RESPONSE_CANCEL, NULL); From ad9e7e8be151935c042e48b7bc77c150c88af34b Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 30 Aug 2020 00:52:52 +0200 Subject: [PATCH 19/26] GTK: Replace deprecated GtkHRange with horizontal GtkRange --- desmume/src/frontend/posix/gtk/main.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 3c3d618ff..86476864b 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -1948,22 +1948,22 @@ static gint Key_Release(GtkWidget *w, GdkEventKey *e, gpointer data) /////////////////////////////// SET AUDIO VOLUME ////////////////////////////////////// -static void CallbackSetAudioVolume(GtkWidget *hscale, gpointer data) +static void CallbackSetAudioVolume(GtkWidget *scale, gpointer data) { - SNDSDLSetAudioVolume(gtk_range_get_value(GTK_RANGE(hscale))); + SNDSDLSetAudioVolume(gtk_range_get_value(GTK_RANGE(scale))); config.audio_volume = SNDSDLGetAudioVolume(); } static void SetAudioVolume() { GtkWidget *dialog = NULL; - GtkWidget *hscale = NULL; + GtkWidget *scale = NULL; int audio_volume = SNDSDLGetAudioVolume(); dialog = gtk_dialog_new_with_buttons("Set audio volume", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, "_OK", GTK_RESPONSE_OK, "_Cancel", GTK_RESPONSE_CANCEL, NULL); - hscale = gtk_hscale_new_with_range(0, SDL_MIX_MAXVOLUME, 1); - gtk_range_set_value(GTK_RANGE(hscale), SNDSDLGetAudioVolume()); - g_signal_connect(G_OBJECT(hscale), "value-changed", G_CALLBACK(CallbackSetAudioVolume), NULL); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hscale, TRUE, FALSE, 0); + scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, SDL_MIX_MAXVOLUME, 1); + gtk_range_set_value(GTK_RANGE(scale), SNDSDLGetAudioVolume()); + g_signal_connect(G_OBJECT(scale), "value-changed", G_CALLBACK(CallbackSetAudioVolume), NULL); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scale, TRUE, FALSE, 0); gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); switch(gtk_dialog_run(GTK_DIALOG(dialog))) { @@ -2197,7 +2197,7 @@ static void EmulationSettingsDialog(){ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); GtkAdjustment* JITBlockSizeAdjustment=(GtkAdjustment*)gtk_adjustment_new(config.jit_max_block_size,1,100,1,5,0); - esKey=gtk_hscale_new(JITBlockSizeAdjustment); + esKey=gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, JITBlockSizeAdjustment); gtk_scale_set_digits((GtkScale*)esKey,0); g_signal_connect(G_OBJECT(JITBlockSizeAdjustment),"value_changed",G_CALLBACK(JITMaxBlockSizeChanged),NULL); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(esDialog))), esKey,TRUE, FALSE, 0); From 3c32aeb0f5c52b82067fded34525f7ea6e2c5296 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 30 Aug 2020 00:54:09 +0200 Subject: [PATCH 20/26] GTK: Replace deprecated GtkHButtonBox with horizontal GtkButtonBox --- desmume/src/frontend/posix/gtk/cheatsGTK.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/cheatsGTK.cpp b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp index 6b82ce6bf..c9a2240d0 100644 --- a/desmume/src/frontend/posix/gtk/cheatsGTK.cpp +++ b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp @@ -306,7 +306,7 @@ static GtkWidget *cheat_list_create_ui() GtkListStore *store = cheat_list_populate(); GtkWidget *tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); - GtkWidget *hbbox = gtk_hbutton_box_new(); + GtkWidget *hbbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); GtkWidget *button; gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(tree)); @@ -353,7 +353,7 @@ static void cheat_search_create_ui() { GtkWidget *button; GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); - GtkWidget *hbbox = gtk_hbutton_box_new(); + GtkWidget *hbbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); GtkWidget *b; gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(box)); From 0c9a8a528200c6b8fed1b0c22db7a3c70110f151 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 30 Aug 2020 01:00:16 +0200 Subject: [PATCH 21/26] GTK: Replace deprecated gdk_window_get_pointer() with gdk_window_get_device_position() --- desmume/src/frontend/posix/gtk/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 86476864b..72cc6a81c 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -1797,7 +1797,7 @@ static gboolean Stylus_Move(GtkWidget *w, GdkEventMotion *e, gpointer data) if(click) { if(e->is_hint) - gdk_window_get_pointer(gtk_widget_get_window(w), &x, &y, &state); + gdk_window_get_device_position(gtk_widget_get_window(w), e->device, &x, &y, &state); else { x= (gint)e->x; y= (gint)e->y; @@ -1833,7 +1833,7 @@ static gboolean Stylus_Press(GtkWidget * w, GdkEventButton * e, } if (e->button == 1) { - gdk_window_get_pointer(gtk_widget_get_window(w), &x, &y, &state); + gdk_window_get_device_position(gtk_widget_get_window(w), e->device, &x, &y, &state); if(state & GDK_BUTTON1_MASK) { #ifdef HAVE_LIBAGG From ef0e3b3adf9f99bf06932adb4e6351eeb8772740 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sat, 29 Aug 2020 19:49:17 +0200 Subject: [PATCH 22/26] GTK: Migrate from GtkAction to GAction --- desmume/src/frontend/posix/gtk/cheatsGTK.cpp | 10 +- desmume/src/frontend/posix/gtk/cheatsGTK.h | 4 +- desmume/src/frontend/posix/gtk/main.cpp | 2087 ++++++++++++------ desmume/src/frontend/posix/gtk/main.h | 4 +- 4 files changed, 1395 insertions(+), 710 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/cheatsGTK.cpp b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp index c9a2240d0..c11e073bb 100644 --- a/desmume/src/frontend/posix/gtk/cheatsGTK.cpp +++ b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp @@ -276,7 +276,7 @@ static void cheatListEnd() { cheats->save(); if(shouldBeRunning) - Launch(); + Launch(NULL, NULL, NULL); } static GtkListStore *cheat_list_populate() @@ -331,10 +331,10 @@ static GtkWidget *cheat_list_create_ui() return tree; } -void CheatList () +void CheatList(GSimpleAction *action, GVariant *parameter, gpointer user_data) { shouldBeRunning = desmume_running(); - Pause(); + Pause(NULL, NULL, NULL); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Cheat List"); gtk_window_set_modal(GTK_WINDOW(win), TRUE); @@ -425,10 +425,10 @@ static void cheatSearchEnd() { } -void CheatSearch () +void CheatSearch(GSimpleAction *action, GVariant *parameter, gpointer user_data) { shouldBeRunning = desmume_running(); - Pause(); + Pause(NULL, NULL, NULL); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Cheat Search"); gtk_window_set_modal(GTK_WINDOW(win), TRUE); diff --git a/desmume/src/frontend/posix/gtk/cheatsGTK.h b/desmume/src/frontend/posix/gtk/cheatsGTK.h index 1d8345459..e78baf127 100644 --- a/desmume/src/frontend/posix/gtk/cheatsGTK.h +++ b/desmume/src/frontend/posix/gtk/cheatsGTK.h @@ -22,8 +22,8 @@ #ifndef __CHEATS_H__ #define __CHEATS_H__ -void CheatSearch (); -void CheatList (); +void CheatSearch(GSimpleAction *action, GVariant *parameter, gpointer user_data); +void CheatList(GSimpleAction *action, GVariant *parameter, gpointer user_data); #endif /*__CHEATS_H__*/ diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 72cc6a81c..dcd386f09 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include "types.h" #include "firmware.h" @@ -122,394 +123,844 @@ gboolean EmuLoop(gpointer data); static AVOutX264 avout_x264; static AVOutFlac avout_flac; -static void RecordAV_x264(); -static void RecordAV_flac(); -static void RecordAV_stop(); +static void RecordAV_x264(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void RecordAV_flac(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void RecordAV_stop(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void RedrawScreen(); -static void DoQuit(); -static void RecordMovieDialog(); -static void PlayMovieDialog(); -static void StopMovie(); -static void OpenNdsDialog(); -static void SaveStateDialog(); -static void LoadStateDialog(); -void Launch(); -void Pause(); +static void DoQuit(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void RecordMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void PlayMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void StopMovie(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void OpenNdsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void SaveStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void LoadStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +void Launch(GSimpleAction *action, GVariant *parameter, gpointer user_data); +void Pause(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void ResetSaveStateTimes(); static void LoadSaveStateInfo(); -static void Printscreen(); -static void Reset(); -static void SetAudioVolume(); -static void SetFirmwareLanguage(); -static void Edit_Controls(); -static void Edit_Joystick_Controls(); -static void MenuSave(GtkMenuItem *item, gpointer slot); -static void MenuLoad(GtkMenuItem *item, gpointer slot); -static void About(); -static void ToggleMenuVisible(GtkToggleAction *action); -static void ToggleStatusbarVisible(GtkToggleAction *action); -static void ToggleToolbarVisible(GtkToggleAction *action); -static void ToggleFullscreen (GtkToggleAction *action); -static void ToggleAudio (GtkToggleAction *action); +static void Printscreen(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Reset(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void SetAudioVolume(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void SetFirmwareLanguage(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Edit_Controls(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Edit_Joystick_Controls(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void MenuSave(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void changesavetype(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void MenuLoad(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void About(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleMenuVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleStatusbarVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleToolbarVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleFullscreen(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleAudio(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Modify_SPUMode(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Modify_SPUInterpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data); #ifdef FAKE_MIC -static void ToggleMicNoise (GtkToggleAction *action); +static void ToggleMicNoise(GSimpleAction *action, GVariant *parameter, gpointer user_data); #endif -static void ToggleFpsLimiter (GtkToggleAction *action); -static void ToggleAutoFrameskip (GtkToggleAction *action); -static void ToggleSwapScreens(GtkToggleAction *action); -static void ToggleGap (GtkToggleAction *action); -static void SetRotation(GtkAction *action, GtkRadioAction *current); -static void SetWinSize(GtkAction *action, GtkRadioAction *current); -static void SetOrientation(GtkAction *action, GtkRadioAction *current); -static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data); +static void ToggleFpsLimiter(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleAutoFrameskip(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Modify_Frameskip(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleSwapScreens(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleGap(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void SetRotation(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void SetWinsize(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Modify_PriInterpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void Modify_Interpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void SetOrientation(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void ToggleLayerVisibility(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void ToggleHudDisplay(GtkToggleAction* action, gpointer data); #ifdef DESMUME_GTK_FIRMWARE_BROKEN -static void SelectFirmwareFile(); +static void SelectFirmwareFile(GSimpleAction *action, GVariant *parameter, gpointer user_data); #endif #ifdef HAVE_JIT -static void EmulationSettingsDialog(); +static void EmulationSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void ToggleJIT(); static void JITMaxBlockSizeChanged(GtkAdjustment* adj,void *); #endif -static void GraphicsSettingsDialog(); +static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); - -static const char *ui_description = -"" -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -#ifdef GTK_DESMUME_FIRMWARE_BROKEN -" " -#endif -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -#ifdef HAVE_LIBAGG -" " -" " -" " -" " -" " -" " -" " -" " -" " -#else -" " -#endif -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -#ifdef HAVE_JIT -" " -#endif -" " -" " -#ifdef FAKE_MIC -" " -#endif -" " -" " -" " -" " -#ifdef HAVE_LIBSOUNDTOUCH -" " -#endif -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -""; - -static const GtkActionEntry action_entries[] = { - { "FileMenu", NULL, "_File" }, - { "open", "gtk-open", "_Open", "o", NULL, OpenNdsDialog }, - { "RecentMenu", NULL, "Open _recent" }, - { "run", "gtk-media-play", "_Run", "Pause", NULL, Launch }, - { "pause", "gtk-media-pause", "_Pause", "Pause", NULL, Pause }, - { "reset", "gtk-refresh", "Re_set", NULL, NULL, Reset }, - { "savestateto", NULL, "Save state _to ...", NULL, NULL, SaveStateDialog }, - { "loadstatefrom", NULL, "Load state _from ...", NULL, NULL, LoadStateDialog }, - { "recordmovie", NULL, "Record movie _to ...", NULL, NULL, RecordMovieDialog }, - { "playmovie", NULL, "Play movie _from ...", NULL, NULL, PlayMovieDialog }, - { "stopmovie", NULL, "Stop movie", NULL, NULL, StopMovie }, - { "RecordAVMenu", NULL, "Record _video/audio" }, - { "record_x264", "gtk-media-record", "Record lossless H._264 (video only)...", NULL, NULL, RecordAV_x264 }, - { "record_flac", "gtk-media-record", "Record _flac (audio only)...", NULL, NULL, RecordAV_flac }, - { "record_stop", "gtk-media-stop", "_Stop recording", NULL, NULL, RecordAV_stop }, - { "SavestateMenu", NULL, "_Save state" }, - { "LoadstateMenu", NULL, "_Load state" }, +static const char *menu_builder = +"" +"" +" " +" " +" _File" +"
" +" " +" _Open" +" app.open" +" <Control>o" +" " +" " +" Open _recent" +" " +"
" +"
" +" " +" _Run" +" app.run" +" Pause" +" " +" " +" _Pause" +" app.pause" +" Pause" +" " +" " +" Re_set" +" app.reset" +" " +"
" +"
" +" " +" Save state _to…" +" app.save_state_to" +" " +" " +" Load state _from…" +" app.load_state_from" +" " +" " +" _Save state" +" " +" " +" _Load state" +" " +"
" +"
" +" " +" Record movie _to…" +" app.record_movie_to" +" " +" " +" Play movie _from…" +" app.play_movie_from" +" " +" " +" Stop movie" +" app.stop_movie" +" " +"
" +"
" +" " +" Record _video/audio" +"
" +" " +" Record lossless H._264 (video only)…" +" app.record_x264" +" " +" " +" Record _FLAC (audio only)…" +" app.record_flac" +" " +" " +" _Stop recording" +" app.stop_recording" +" " +"
" +"
" #ifdef DESMUME_GTK_FIRMWARE_BROKEN - { "loadfirmware","gtk-open", "Load Firm_ware file", "l", NULL, SelectFirmwareFile }, +" " +" Load Firm_ware file" +" app.loadfirmware" +" " #endif - { "printscreen","gtk-media-record", "Take a _screenshot", "s", NULL, Printscreen }, - { "quit", "gtk-quit", "_Quit", "q", NULL, DoQuit }, - - { "ViewMenu", NULL, "_View" }, - { "RotationMenu", NULL, "_Rotation" }, - { "OrientationMenu", NULL, "LCDs _Layout" }, - { "WinsizeMenu", NULL, "_Window Size" }, - { "PriInterpolationMenu", NULL, "Video _Filter" }, - { "InterpolationMenu", NULL, "S_econdary Video Filter" }, - { "HudMenu", NULL, "_HUD" }, -#ifndef HAVE_LIBAGG - { "hud_notsupported", NULL, "HUD support not compiled" }, +" " +" Take a screenshot" +" app.printscreen" +" <Control>s" +" " +"
" +"
" +" " +" _Quit" +" app.quit" +" <Control>q" +" " +"
" +"
" +" " +" _View" +"
" +" " +" LCDs _Layout" +"
" +" " +" _Vertical" +" app.orient" +" vertical" +" <Control>1" +" " +" " +" _Horizontal" +" app.orient" +" horizontal" +" <Control>2" +" " +" " +" _Single screen" +" app.orient" +" single" +" <Control>0" +" " +"
" +"
" +" " +" S_wap screens" +" app.swapscreens" +" space" +" " +"
" +"
" +" " +" _Rotation" +"
" +" " +" _0°" +" app.rotate" +" 0" +" " +" " +" _90°" +" app.rotate" +" 90" +" " +" " +" _180°" +" app.rotate" +" 180" +" " +" " +" _270°" +" app.rotate" +" 270" +" " +"
" +"
" +" " +" _Window Size" +"
" +" " +" 0_.5×" +" app.winsize" +" 0.5" +" " +" " +" _1×" +" app.winsize" +" 1" +" " +" " +" 1.5×" +" app.winsize" +" 1.5" +" " +" " +" _2×" +" app.winsize" +" 2" +" " +" " +" 2.5×" +" app.winsize" +" 2.5" +" " +" " +" _3×" +" app.winsize" +" 3" +" " +" " +" _4×" +" app.winsize" +" 4" +" " +" " +" _5×" +" app.winsize" +" 5" +" " +" " +" _Scale to window" +" app.winsize" +" scale" +" " +"
" +"
" +" " +" _Fullscreen" +" app.fullscreen" +" F11" +" " +"
" +"
" +" " +" Screen _Gap" +" app.gap" +" " +" " +" Video _Filter" +"
" +" " +" _None" +" app.pri_interpolation" +" none" +" " +" " +" _LQ2X" +" app.pri_interpolation" +" lq2x" +" " +" " +" _LQ2XS" +" app.pri_interpolation" +" lq2xs" +" " +" " +" _HQ2X" +" app.pri_interpolation" +" hq2x" +" " +" " +" _HQ2XS" +" app.pri_interpolation" +" hq2xs" +" " +" " +" _HQ3X" +" app.pri_interpolation" +" hq3x" +" " +" " +" _HQ3XS" +" app.pri_interpolation" +" hq3xs" +" " +" " +" _HQ4X" +" app.pri_interpolation" +" hq4x" +" " +" " +" _HQ4XS" +" app.pri_interpolation" +" hq4xs" +" " +" " +" _2xSaI" +" app.pri_interpolation" +" 2xsai" +" " +" " +" _Super2xSaI" +" app.pri_interpolation" +" super2xsai" +" " +" " +" _SuperEagle" +" app.pri_interpolation" +" supereagle" +" " +" " +" _Scanline" +" app.pri_interpolation" +" scanline" +" " +" " +" _Bilinear" +" app.pri_interpolation" +" bilinear" +" " +" " +" _Nearest2X" +" app.pri_interpolation" +" nearest2x" +" " +" " +" _Nearest1_5X" +" app.pri_interpolation" +" nearest_1point5x" +" " +" " +" _NearestPlus1_5X" +" app.pri_interpolation" +" nearestplus_1point5x" +" " +" " +" _EPX" +" app.pri_interpolation" +" epx" +" " +" " +" _EPXPlus" +" app.pri_interpolation" +" epxplus" +" " +" " +" _EPX1_5X" +" app.pri_interpolation" +" epx_1point5x" +" " +" " +" _EPXPlus1_5X" +" app.pri_interpolation" +" epxplus_1point5x" +" " +" " +" _2xBRZ" +" app.pri_interpolation" +" 2xbrz" +" " +" " +" _3xBRZ" +" app.pri_interpolation" +" 3xbrz" +" " +" " +" _4xBRZ" +" app.pri_interpolation" +" 4xbrz" +" " +" " +" _5xBRZ" +" app.pri_interpolation" +" 5xbrz" +" " +"
" +"
" +" " +" S_econdary Video Filter" +"
" +" " +" _Fast" +" app.interpolation" +" fast" +" " +" " +" _Nearest-neighbor" +" app.interpolation" +" nearest" +" " +" " +" _Good" +" app.interpolation" +" good" +" " +" " +" B_ilinear" +" app.interpolation" +" bilinear" +" " +" " +" B_est" +" app.interpolation" +" best" +" " +//" " +//" G_aussian" +//" app.interpolation" +//" gaussian" +//" " +"
" +"
" +" " +" _HUD" +#ifdef HAVE_LIBAGG +"
" +" " +" Display _fps" +" app.hud_fps" +" " +" " +" Display _Input" +" app.hud_input" +" " +" " +" Display _Graphical Input" +" app.hud_graphicalinput" +" " +" " +" Display Frame _Counter" +" app.hud_framecounter" +" " +" " +" Display _Lag Counter" +" app.hud_lagcounter" +" " +" " +" Display _RTC" +" app.hud_rtc" +" " +" " +" Display _Mic" +" app.hud_mic" +" " +"
" +"
" +" " +" _Editor mode" +" app.hud_editor" +" " +"
" +#else +" " +" HUD support not compiled" +" app.hud_notsupported" +" " #endif - - { "ConfigMenu", NULL, "_Config" }, - { "FrameskipMenu", NULL, "_Frameskip" }, +"
" +"
" +"
" +" " +" Show _menu" +" app.view_menu" +" " +" " +" Show _toolbar" +" app.view_toolbar" +" " +" " +" Show _statusbar" +" app.view_statusbar" +" " +"
" +"
" +" " +" _Config" +"
" +" " +" _Frameskip" +"
" +" " +" _Limit framerate" +" app.enablefpslimiter" +" " +"
" +"
" +" " +" _Auto-minimize skipping" +" app.frameskipA" +" " +"
" +"
" +" " +" _0 (never skip)" +" app.frameskip" +" 0" +" " +" " +" _1" +" app.frameskip" +" 1" +" " +" " +" _2" +" app.frameskip" +" 2" +" " +" " +" _3" +" app.frameskip" +" 3" +" " +" " +" _4" +" app.frameskip" +" 4" +" " +" " +" _5" +" app.frameskip" +" 5" +" " +" " +" _6" +" app.frameskip" +" 6" +" " +" " +" _7" +" app.frameskip" +" 7" +" " +" " +" _8" +" app.frameskip" +" 8" +" " +" " +" _9" +" app.frameskip" +" 9" +" " +"
" +"
" #ifdef HAVE_JIT - { "emulationsettings",NULL,"Em_ulation Settings",NULL,NULL,EmulationSettingsDialog}, +" " +" Em_ulation Settings" +" app.emulationsettings" +" " #endif - { "graphicssettings",NULL,"_Graphics Settings",NULL,NULL, GraphicsSettingsDialog}, - { "SPUModeMenu", NULL, "Audio _Synchronization" }, - { "SPUInterpolationMenu", NULL, "Audio _Interpolation" }, - { "CheatMenu", NULL, "_Cheat" }, - { "cheatsearch", NULL, "_Search", NULL, NULL, CheatSearch }, - { "cheatlist", NULL, "_List", NULL, NULL, CheatList }, - { "ConfigSaveMenu", NULL, "_Saves" }, - { "setaudiovolume", NULL, "Set audio _volume", NULL, NULL, SetAudioVolume }, - { "setfirmwarelanguage", NULL, "Set firmware _language", NULL, NULL, SetFirmwareLanguage }, - { "editctrls", NULL, "_Edit controls",NULL, NULL, Edit_Controls }, - { "editjoyctrls", NULL, "Edit _Joystick controls",NULL, NULL, Edit_Joystick_Controls }, - - { "ToolsMenu", NULL, "_Tools" }, - { "LayersMenu", NULL, "View _Layers" }, - - { "HelpMenu", NULL, "_Help" }, - { "about", "gtk-about", "_About", NULL, NULL, About } -}; - -static const GtkToggleActionEntry toggle_entries[] = { - { "enableaudio", NULL, "_Enable audio", NULL, NULL, G_CALLBACK(ToggleAudio), TRUE}, +" " +" _Graphics settings" +" app.graphics_settings" +" " +" " +" _Enable audio" +" app.enableaudio" +" " #ifdef FAKE_MIC - { "micnoise", NULL, "Fake mic _noise", NULL, NULL, G_CALLBACK(ToggleMicNoise), FALSE}, +" " +" Fake mic _noise" +" app.micnoise" +" " #endif - { "enablefpslimiter", NULL, "_Limit framerate", NULL, NULL, G_CALLBACK(ToggleFpsLimiter), TRUE}, - { "frameskipA", NULL, "_Auto-minimize skipping", NULL, NULL, G_CALLBACK(ToggleAutoFrameskip), TRUE}, - { "gap", NULL, "Screen _Gap", NULL, NULL, G_CALLBACK(ToggleGap), FALSE}, - { "view_menu", NULL, "Show _menu", NULL, NULL, G_CALLBACK(ToggleMenuVisible), TRUE}, - { "view_toolbar", NULL, "Show _toolbar", NULL, NULL, G_CALLBACK(ToggleToolbarVisible), TRUE}, - { "view_statusbar", NULL, "Show _statusbar", NULL, NULL, G_CALLBACK(ToggleStatusbarVisible), TRUE}, - { "orient_swapscreens", NULL, "S_wap screens", "space", NULL, G_CALLBACK(ToggleSwapScreens), FALSE}, - { "fullscreen", NULL, "_Fullscreen", "F11", NULL, G_CALLBACK(ToggleFullscreen), FALSE}, -}; +" " +" Audio _Synchronization" +"
" +" " +" _Dual Asynchronous" +" app.spu_mode" +" dual-async" +" " +" " +" Synchronous (_N)" +" app.spu_mode" +" sync-n" +" " +" " +" Synchronous (_Z)" +" app.spu_mode" +" sync-z" +" " +#ifdef HAVE_LIBSOUNDTOUCH +" " +" Synchronous (_P)" +" app.spu_mode" +" sync-p" +" " +#endif +"
" +"
" +" " +" Audio _Interpolation" +"
" +" " +" _None" +" app.spu_interpolation" +" none" +" " +" " +" _Linear" +" app.spu_interpolation" +" linear" +" " +" " +" _Cosine" +" app.spu_interpolation" +" cosine" +" " +"
" +"
" +" " +" _Cheat" +"
" +" " +" _Search" +" app.cheatsearch" +" " +" " +" _List" +" app.cheatlist" +" " +"
" +"
" +" " +" _Saves" +"
" +" " +" _0 Autodetect" +" app.savetype" +" autodetect" +" " +" " +" _1 EEPROM 4kbit" +" app.savetype" +" eeprom-4k" +" " +" " +" _2 EEPROM 64kbit" +" app.savetype" +" eeprom-64k" +" " +" " +" _3 EEPROM 512kbit" +" app.savetype" +" eeprom-512k" +" " +" " +" _4 FRAM 256kbit" +" app.savetype" +" fram-256k" +" " +" " +" _5 FLASH 2mbit" +" app.savetype" +" flash-2m" +" " +" " +" _6 FLASH 4mbit" +" app.savetype" +" flash-4m" +" " +"
" +"
" +" " +" Set audio _volume" +" app.setaudiovolume" +" " +" " +" Set firmware _language" +" app.setfirmwarelanguage" +" " +" " +" _Edit controls" +" app.editctrls" +" " +" " +" Edit _Joystick controls" +" app.editjoyctrls" +" " +"
" +"
" +" " +" _Tools" +"
" +" " +" _IO regs view" +" app.ioregs" +" " +" " +" View _Layers" +"
" +" " +" _0 Main BG 0" +" app.layermainbg0" +" " +" " +" _1 Main BG 1" +" app.layermainbg1" +" " +" " +" _2 Main BG 2" +" app.layermainbg2" +" " +" " +" _3 Main BG 3" +" app.layermainbg3" +" " +" " +" _4 Main OBJ" +" app.layermainobj" +" " +" " +" _5 SUB BG 0" +" app.layersubbg0" +" " +" " +" _6 SUB BG 1" +" app.layersubbg1" +" " +" " +" _7 SUB BG 2" +" app.layersubbg2" +" " +" " +" _8 SUB BG 3" +" app.layersubbg3" +" " +" " +" _9 SUB OBJ" +" app.layersubobj" +" " +"
" +"
" +"
" +"
" +" " +" _Help" +"
" +" " +" _About" +" app.about" +" " +"
" +"
" +"
" +"
"; -static const GtkRadioActionEntry pri_interpolation_entries[] = { - { "pri_interp_none", NULL, VideoFilterAttributesList[VideoFilterTypeID_None].typeString, NULL, NULL, VideoFilterTypeID_None}, - { "pri_interp_lq2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_LQ2X].typeString, NULL, NULL, VideoFilterTypeID_LQ2X}, - { "pri_interp_lq2xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_LQ2XS].typeString, NULL, NULL, VideoFilterTypeID_LQ2XS}, - { "pri_interp_hq2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ2X].typeString, NULL, NULL, VideoFilterTypeID_HQ2X}, - { "pri_interp_hq2xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ2XS].typeString, NULL, NULL, VideoFilterTypeID_HQ2XS}, - { "pri_interp_hq3x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ3X].typeString, NULL, NULL, VideoFilterTypeID_HQ3X}, - { "pri_interp_hq3xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ3XS].typeString, NULL, NULL, VideoFilterTypeID_HQ3XS}, - { "pri_interp_hq4x", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ4X].typeString, NULL, NULL, VideoFilterTypeID_HQ4X}, - { "pri_interp_hq4xs", NULL, VideoFilterAttributesList[VideoFilterTypeID_HQ4XS].typeString, NULL, NULL, VideoFilterTypeID_HQ4XS}, - { "pri_interp_2xsai", NULL, VideoFilterAttributesList[VideoFilterTypeID_2xSaI].typeString, NULL, NULL, VideoFilterTypeID_2xSaI}, - { "pri_interp_super2xsai", NULL, VideoFilterAttributesList[VideoFilterTypeID_Super2xSaI].typeString, NULL, NULL, VideoFilterTypeID_Super2xSaI}, - { "pri_interp_supereagle", NULL, VideoFilterAttributesList[VideoFilterTypeID_SuperEagle].typeString, NULL, NULL, VideoFilterTypeID_SuperEagle}, - { "pri_interp_scanline", NULL, VideoFilterAttributesList[VideoFilterTypeID_Scanline].typeString, NULL, NULL, VideoFilterTypeID_Scanline}, - { "pri_interp_bilinear", NULL, VideoFilterAttributesList[VideoFilterTypeID_Bilinear].typeString, NULL, NULL, VideoFilterTypeID_Bilinear}, - { "pri_interp_nearest2x", NULL, VideoFilterAttributesList[VideoFilterTypeID_Nearest2X].typeString, NULL, NULL, VideoFilterTypeID_Nearest2X}, - { "pri_interp_nearest_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_Nearest1_5X].typeString, NULL, NULL, VideoFilterTypeID_Nearest1_5X}, - { "pri_interp_nearestplus_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_NearestPlus1_5X].typeString, NULL, NULL, VideoFilterTypeID_NearestPlus1_5X}, - { "pri_interp_epx", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPX].typeString, NULL, NULL, VideoFilterTypeID_EPX}, - { "pri_interp_epxplus", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPXPlus].typeString, NULL, NULL, VideoFilterTypeID_EPXPlus}, - { "pri_interp_epx_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPX1_5X].typeString, NULL, NULL, VideoFilterTypeID_EPX1_5X}, - { "pri_interp_epxplus_1point5x", NULL, VideoFilterAttributesList[VideoFilterTypeID_EPXPlus1_5X].typeString, NULL, NULL, VideoFilterTypeID_EPXPlus1_5X}, - { "pri_interp_2xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_2xBRZ].typeString, NULL, NULL, VideoFilterTypeID_2xBRZ}, - { "pri_interp_3xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_3xBRZ].typeString, NULL, NULL, VideoFilterTypeID_3xBRZ}, - { "pri_interp_4xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_4xBRZ].typeString, NULL, NULL, VideoFilterTypeID_4xBRZ}, - { "pri_interp_5xbrz", NULL, VideoFilterAttributesList[VideoFilterTypeID_5xBRZ].typeString, NULL, NULL, VideoFilterTypeID_5xBRZ}, -}; +static const GActionEntry app_entries[] = { + // File + { "open", OpenNdsDialog }, + { "run", Launch }, + { "pause", Pause }, + { "reset", Reset }, + { "savestateto", SaveStateDialog }, + { "loadstatefrom", LoadStateDialog }, + { "recordmovie", RecordMovieDialog }, + { "playmovie", PlayMovieDialog }, + { "stopmovie", StopMovie }, + { "record_x264", RecordAV_x264 }, + { "record_flac", RecordAV_flac }, + { "record_stop", RecordAV_stop }, +#ifdef DESMUME_GTK_FIRMWARE_BROKEN + { "loadfirmware", SelectFirmwareFile }, +#endif + { "printscreen", Printscreen }, + { "quit", DoQuit }, -static const GtkRadioActionEntry interpolation_entries[] = { - { "interp_fast", NULL, "_Fast", NULL, NULL, CAIRO_FILTER_FAST }, - { "interp_nearest", NULL, "_Nearest-neighbor", NULL, NULL, CAIRO_FILTER_NEAREST }, - { "interp_good", NULL, "_Good", NULL, NULL, CAIRO_FILTER_GOOD }, - { "interp_bilinear", NULL, "_Bilinear", NULL, NULL, CAIRO_FILTER_BILINEAR }, - { "interp_best", NULL, "B_est", NULL, NULL, CAIRO_FILTER_BEST }, -}; + // View + { "orient", SetOrientation, "s", "\"vertical\"" }, + { "swapscreens", ToggleSwapScreens, NULL, "true" }, + { "rotate", SetRotation, "s", "\"0\"" }, + { "winsize", SetWinsize, "s", "\"scale\"" }, + { "fullscreen", ToggleFullscreen, NULL, "false" }, + { "gap", ToggleGap, NULL, "false" }, + { "pri_interpolation", Modify_PriInterpolation, "s", "\"none\"" }, + { "interpolation", Modify_Interpolation, "s", "\"nearest\"" }, + { "view_menu", ToggleMenuVisible, NULL, "true" }, + { "view_toolbar", ToggleToolbarVisible, NULL, "true" }, + { "view_statusbar", ToggleStatusbarVisible, NULL, "true" }, -static const GtkRadioActionEntry rotation_entries[] = { - { "rotate_0", "gtk-orientation-portrait", "_0", NULL, NULL, 0 }, - { "rotate_90", "gtk-orientation-landscape", "_90", NULL, NULL, 90 }, - { "rotate_180", "gtk-orientation-reverse-portrait", "_180",NULL, NULL, 180 }, - { "rotate_270", "gtk-orientation-reverse-landscape", "_270",NULL, NULL, 270 }, + // Config + { "enablefpslimiter", ToggleFpsLimiter, NULL, "true" }, + { "frameskipA", ToggleAutoFrameskip, NULL, "true" }, + { "frameskip", Modify_Frameskip, "s", "\"0\"" }, + { "enableaudio", ToggleAudio, NULL, "true" }, +#ifdef FAKE_MIC + { "micnoise", ToggleMicNoise, NULL, "false" }, +#endif +#ifdef HAVE_JIT + { "emulationsettings", EmulationSettingsDialog }, +#endif + { "graphics_settings", GraphicsSettingsDialog }, + { "spu_mode", Modify_SPUMode, "s", "\"dual-async\"" }, + { "spu_interpolation", Modify_SPUInterpolation, "s", "\"linear\"" }, + { "cheatsearch", CheatSearch }, + { "cheatlist", CheatList }, + { "savetype", changesavetype, "s", "\"autodetect\"" }, + { "setaudiovolume", SetAudioVolume }, + { "setfirmwarelanguage", SetFirmwareLanguage }, + { "editctrls", Edit_Controls }, + { "editjoyctrls", Edit_Joystick_Controls }, + + // Tools + // Populated in desmume_gtk_menu_tools(). + + // Help + { "about", About }, }; static const char *graphics_settings = @@ -633,18 +1084,6 @@ enum winsize_enum { static winsize_enum winsize_current; -static const GtkRadioActionEntry winsize_entries[] = { - { "winsize_half", NULL, "0_.5x", NULL, NULL, WINSIZE_HALF }, - { "winsize_1", NULL, "_1x", NULL, NULL, WINSIZE_1 }, - { "winsize_1half", NULL, "1.5x", NULL, NULL, WINSIZE_1HALF }, - { "winsize_2", NULL, "_2x", NULL, NULL, WINSIZE_2 }, - { "winsize_2half", NULL, "2.5x", NULL, NULL, WINSIZE_2HALF }, - { "winsize_3", NULL, "_3x", NULL, NULL, WINSIZE_3 }, - { "winsize_4", NULL, "_4x", NULL, NULL, WINSIZE_4 }, - { "winsize_5", NULL, "_5x", NULL, NULL, WINSIZE_5 }, - { "winsize_scale", NULL, "_Scale to window", NULL, NULL, WINSIZE_SCALE }, -}; - /* When adding modes here remember to add the relevent entry to screen_size */ enum orientation_enum { ORIENT_VERTICAL = 0, @@ -653,12 +1092,6 @@ enum orientation_enum { ORIENT_N }; -static const GtkRadioActionEntry orientation_entries[] = { - { "orient_vertical", NULL, "_Vertical", "1", NULL, ORIENT_VERTICAL }, - { "orient_horizontal", NULL, "_Horizontal", "2", NULL, ORIENT_HORIZONTAL }, - { "orient_single", NULL, "_Single screen", "0", NULL, ORIENT_SINGLE }, -}; - struct screen_size_t { gint width; gint height; @@ -677,57 +1110,6 @@ enum spumode_enum { SPUMODE_SYNCP = 3 }; -static const GtkRadioActionEntry spumode_entries[] = { - { "SPUModeSyncN", NULL, "Synchronous (N)", NULL, NULL, SPUMODE_SYNCN}, - { "SPUModeSyncZ", NULL, "Synchronous (Z)", NULL, NULL, SPUMODE_SYNCZ}, -#ifdef HAVE_LIBSOUNDTOUCH - { "SPUModeSyncP", NULL, "Synchronous (P)", NULL, NULL, SPUMODE_SYNCP}, -#endif - { "SPUModeDualASync", NULL, "Dual Asynchronous", NULL, NULL, SPUMODE_DUALASYNC} -}; - -static const GtkRadioActionEntry spuinterpolation_entries[] = { - { "SPUInterpolationNone", NULL, "_None", NULL, NULL, SPUInterpolation_None }, - { "SPUInterpolationLinear", NULL, "_Linear", NULL, NULL, SPUInterpolation_Linear }, - { "SPUInterpolationCosine", NULL, "_Cosine", NULL, NULL, SPUInterpolation_Cosine } -}; - -enum frameskip_enum { - FRAMESKIP_0 = 0, - FRAMESKIP_1 = 1, - FRAMESKIP_2 = 2, - FRAMESKIP_3 = 3, - FRAMESKIP_4 = 4, - FRAMESKIP_5 = 5, - FRAMESKIP_6 = 6, - FRAMESKIP_7 = 7, - FRAMESKIP_8 = 8, - FRAMESKIP_9 = 9, -}; - -static const GtkRadioActionEntry frameskip_entries[] = { - { "frameskip0", NULL, "_0 (never skip)", NULL, NULL, FRAMESKIP_0}, - { "frameskip1", NULL, "_1", NULL, NULL, FRAMESKIP_1}, - { "frameskip2", NULL, "_2", NULL, NULL, FRAMESKIP_2}, - { "frameskip3", NULL, "_3", NULL, NULL, FRAMESKIP_3}, - { "frameskip4", NULL, "_4", NULL, NULL, FRAMESKIP_4}, - { "frameskip5", NULL, "_5", NULL, NULL, FRAMESKIP_5}, - { "frameskip6", NULL, "_6", NULL, NULL, FRAMESKIP_6}, - { "frameskip7", NULL, "_7", NULL, NULL, FRAMESKIP_7}, - { "frameskip8", NULL, "_8", NULL, NULL, FRAMESKIP_8}, - { "frameskip9", NULL, "_9", NULL, NULL, FRAMESKIP_9}, -}; - -static const GtkRadioActionEntry savet_entries[] = { - { "save_t0", NULL, "_0 Autodetect", NULL, NULL, 0}, - { "save_t1", NULL, "_1 EEPROM 4kbit", NULL, NULL, 1}, - { "save_t2", NULL, "_2 EEPROM 64kbit", NULL, NULL, 2}, - { "save_t3", NULL, "_3 EEPROM 512kbit", NULL, NULL, 3}, - { "save_t4", NULL, "_4 FRAM 256kbit", NULL, NULL, 4}, - { "save_t5", NULL, "_5 FLASH 2mbit", NULL, NULL, 5}, - { "save_t6", NULL, "_6 FLASH 4mbit", NULL, NULL, 6} -}; - SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDSDL, @@ -921,11 +1303,10 @@ uint autoFrameskipMax = 0; bool autoframeskip = true; cairo_filter_t Interpolation = CAIRO_FILTER_NEAREST; +static GtkApplication *pApp; static GtkWidget *pWindow; static GtkWidget *pStatusBar; static GtkWidget *pDrawingArea; -static GtkActionGroup * action_group; -static GtkUIManager *ui_manager; struct nds_screen_t { guint gap_size; @@ -949,7 +1330,7 @@ static inline void UpdateStatusBar (const char *message) gtk_statusbar_push(GTK_STATUSBAR(pStatusBar), pStatusBar_Ctx, message); } -static void About() +static void About(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GdkPixbuf * pixbuf = gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm); @@ -971,56 +1352,65 @@ static void About() g_object_unref(pixbuf); } -static void ToggleMenuVisible(GtkToggleAction *action) +static void ToggleMenuVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - GtkWidget *pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); - - config.view_menu = gtk_toggle_action_get_active(action); - if (config.view_menu) - gtk_widget_show(pMenuBar); - else - gtk_widget_hide(pMenuBar); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.view_menu = value; + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(pWindow), config.view_menu); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } -static void ToggleToolbarVisible(GtkToggleAction *action) +static void ToggleToolbarVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data) { +#if 0 GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); - config.view_toolbar = gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.view_toolbar = value; if (config.view_toolbar) gtk_widget_show(pToolBar); else gtk_widget_hide(pToolBar); + g_simple_action_set_state(action, g_variant_new_boolean(value)); +#endif } -static void ToggleStatusbarVisible(GtkToggleAction *action) +static void ToggleStatusbarVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - config.view_statusbar = gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.view_statusbar = value; if (config.view_statusbar) gtk_widget_show(pStatusBar); else gtk_widget_hide(pStatusBar); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } -static void ToggleFullscreen(GtkToggleAction *action) +static void ToggleFullscreen(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - GtkWidget *pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); - GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); - config.window_fullscreen = gtk_toggle_action_get_active(action); + GtkWidget *pToolBar = NULL; //gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean fullscreen = !g_variant_get_boolean(variant); + config.window_fullscreen = fullscreen; + printf("ToggleFullscreen -> %d\n", fullscreen); + g_simple_action_set_state(action, g_variant_new_boolean(fullscreen)); if (config.window_fullscreen) { - gtk_widget_hide(pMenuBar); + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(pWindow), FALSE); gtk_widget_hide(pToolBar); gtk_widget_hide(pStatusBar); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_menu"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "view_menu")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "view_toolbar")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "view_statusbar")), FALSE); gtk_window_fullscreen(GTK_WINDOW(pWindow)); } else { if (config.view_menu) { - gtk_widget_show(pMenuBar); + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(pWindow), TRUE); } if (config.view_toolbar) { gtk_widget_show(pToolBar); @@ -1028,9 +1418,9 @@ static void ToggleFullscreen(GtkToggleAction *action) if (config.view_statusbar) { gtk_widget_show(pStatusBar); } - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_menu"), TRUE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_toolbar"), TRUE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_statusbar"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "view_menu")), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "view_toolbar")), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "view_statusbar")), TRUE); gtk_window_unfullscreen(GTK_WINDOW(pWindow)); } } @@ -1043,12 +1433,12 @@ static int Open(const char *filename) res = NDS_LoadROM( filename ); if(res > 0) { LoadSaveStateInfo(); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "cheatlist")), TRUE); } return res; } -void Launch() +void Launch(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *pause; desmume_resume(); @@ -1059,35 +1449,36 @@ void Launch() UpdateStatusBar("Running ..."); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), TRUE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), TRUE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "pause")), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "run")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "reset")), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "printscreen")), TRUE); - pause = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/pause"))); - gtk_widget_grab_focus(pause); + //pause = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/pause"))); + //gtk_widget_grab_focus(pause); } -void Pause() + +void Pause(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *run; desmume_pause(); UpdateStatusBar("Paused"); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "pause")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "run")), TRUE); - run = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/run"))); - gtk_widget_grab_focus(run); + //run = gtk_bin_get_child(GTK_BIN(gtk_ui_manager_get_widget(ui_manager, "/ToolBar/run"))); + //gtk_widget_grab_focus(run); } -static void LoadStateDialog() +static void LoadStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_ds, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); @@ -1121,7 +1512,7 @@ static void LoadStateDialog() gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "run")), TRUE); } g_free(sPath); @@ -1129,13 +1520,13 @@ static void LoadStateDialog() g_object_unref(pFileSelection); } -static void RecordMovieDialog() +static void RecordMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_dsm, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); @@ -1167,18 +1558,18 @@ static void RecordMovieDialog() g_object_unref(pFileSelection); } -static void StopMovie() +static void StopMovie(GSimpleAction *action, GVariant *parameter, gpointer user_data) { FCEUI_StopMovie(); } -static void PlayMovieDialog() +static void PlayMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_dsm, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); @@ -1211,13 +1602,13 @@ static void PlayMovieDialog() g_object_unref(pFileSelection); } -static void SaveStateDialog() +static void SaveStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_ds, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); @@ -1252,7 +1643,7 @@ static void SaveStateDialog() gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } else { - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "run")), TRUE); } g_free(sPath); @@ -1260,13 +1651,13 @@ static void SaveStateDialog() g_object_unref(pFileSelection); } -static void RecordAV_x264() +static void RecordAV_x264(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_mkv, *pFilter_mp4, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_mkv = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_mkv, "*.mkv"); @@ -1298,7 +1689,7 @@ static void RecordAV_x264() gchar *sPath = g_file_get_path(file); if(avout_x264.begin(sPath)) { - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_x264"), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "record_x264")), FALSE); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, @@ -1314,13 +1705,13 @@ static void RecordAV_x264() g_object_unref(pFileSelection); } -static void RecordAV_flac() +static void RecordAV_flac(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_flac, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_flac = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_flac, "*.flac"); @@ -1347,7 +1738,7 @@ static void RecordAV_flac() gchar *sPath = g_file_get_path(file); if(avout_flac.begin(sPath)) { - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_flac"), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "record_flac")), FALSE); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, @@ -1363,20 +1754,20 @@ static void RecordAV_flac() g_object_unref(pFileSelection); } -static void RecordAV_stop() { +static void RecordAV_stop(GSimpleAction *action, GVariant *parameter, gpointer user_data) { avout_x264.end(); avout_flac.end(); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_x264"), TRUE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "record_flac"), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "record_x264")), TRUE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "record_flac")), TRUE); } -static void OpenNdsDialog() +static void OpenNdsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_nds, *pFilter_dsgba, *pFilter_any; GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS]"); @@ -1437,8 +1828,8 @@ static void OpenNdsDialog() g_free(uri); g_free(recentData.app_exec); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); - Launch(); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "run")), TRUE); + Launch(NULL, NULL, NULL); } g_free(sPath); @@ -1453,14 +1844,14 @@ static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) int ret; if (desmume_running()) - Pause(); + Pause(NULL, NULL, NULL); uri = gtk_recent_chooser_get_current_uri(chooser); romname = g_filename_from_uri(uri, NULL, NULL); ret = Open(romname); if (ret > 0) { - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), TRUE); - Launch(); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "run")), TRUE); + Launch(NULL, NULL, NULL); } else { gtk_recent_manager_remove_item(recent_manager, uri, NULL); GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), @@ -1476,14 +1867,14 @@ static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) g_free(romname); } -static void Reset() +static void Reset(GSimpleAction *action, GVariant *parameter, gpointer user_data) { bool shouldBeRunning = desmume_running(); - Pause(); + Pause(NULL, NULL, NULL); NDS_Reset(); RedrawScreen(); if (shouldBeRunning) { - Launch(); + Launch(NULL, NULL, NULL); } } @@ -1521,48 +1912,79 @@ static void UpdateDrawingAreaAspect() } } -static void ToggleGap(GtkToggleAction* action) +static void ToggleGap(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - config.view_gap = gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.view_gap = value; nds_screen.gap_size = config.view_gap ? GAP_SIZE : 0; UpdateDrawingAreaAspect(); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } -static void SetRotation(GtkAction *action, GtkRadioAction *current) +static void SetRotation(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - nds_screen.rotation_angle = gtk_radio_action_get_current_value(current); + const char *string = g_variant_get_string(parameter, NULL); + nds_screen.rotation_angle = g_ascii_strtoll(string, NULL, 10); config.view_rot = nds_screen.rotation_angle; UpdateDrawingAreaAspect(); + g_simple_action_set_state(action, parameter); } -static void SetWinsize(GtkAction *action, GtkRadioAction *current) +static void SetWinsize(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - winsize_current = (winsize_enum) gtk_radio_action_get_current_value(current); - config.window_scale = winsize_current; - if (config.window_fullscreen) { - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "fullscreen"), FALSE); - } - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "fullscreen"), winsize_current == WINSIZE_SCALE); - UpdateDrawingAreaAspect(); + const char *string = g_variant_get_string(parameter, NULL); + winsize_enum winsize; + if (strcmp(string, "scale") == 0) + winsize = WINSIZE_SCALE; + else if (strcmp(string, "0.5") == 0) + winsize = WINSIZE_HALF; + else if (strcmp(string, "1") == 0) + winsize = WINSIZE_1; + else if (strcmp(string, "1.5") == 0) + winsize = WINSIZE_1HALF; + else if (strcmp(string, "2") == 0) + winsize = WINSIZE_2; + else if (strcmp(string, "2.5") == 0) + winsize = WINSIZE_2HALF; + else if (strcmp(string, "3") == 0) + winsize = WINSIZE_3; + else if (strcmp(string, "4") == 0) + winsize = WINSIZE_4; + else if (strcmp(string, "5") == 0) + winsize = WINSIZE_5; + winsize_current = winsize; + config.window_scale = winsize_current; + if (config.window_fullscreen) { + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "fullscreen")), FALSE); + } + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(pApp), "fullscreen")), winsize_current == WINSIZE_SCALE); + UpdateDrawingAreaAspect(); + g_simple_action_set_state(action, parameter); } -static void SetOrientation(GtkAction *action, GtkRadioAction *current) +static void SetOrientation(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - nds_screen.orientation = (orientation_enum)gtk_radio_action_get_current_value(current); + const char *string = g_variant_get_string(parameter, NULL); + nds_screen.orientation = (orientation_enum)g_ascii_strtoll(string, NULL, 10); #ifdef HAVE_LIBAGG osd->singleScreen = nds_screen.orientation == ORIENT_SINGLE; #endif config.view_orient = nds_screen.orientation; UpdateDrawingAreaAspect(); + g_simple_action_set_state(action, parameter); } -static void ToggleSwapScreens(GtkToggleAction *action) { - nds_screen.swap = gtk_toggle_action_get_active(action); +static void ToggleSwapScreens(GSimpleAction *action, GVariant *parameter, gpointer user_data) { + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + nds_screen.swap = value; #ifdef HAVE_LIBAGG osd->swapScreens = nds_screen.swap; #endif config.view_swap = nds_screen.swap; RedrawScreen(); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } static int ConfigureDrawingArea(GtkWidget *widget, GdkEventConfigure *event, gpointer data) @@ -1826,11 +2248,13 @@ static gboolean Stylus_Press(GtkWidget * w, GdkEventButton * e, GdkModifierType state; gint x, y; +#if 0 if (e->button == 3) { GtkWidget * pMenu = gtk_menu_item_get_submenu ( GTK_MENU_ITEM( gtk_ui_manager_get_widget (ui_manager, "/MainMenu/ViewMenu"))); gtk_menu_popup(GTK_MENU(pMenu), NULL, NULL, NULL, NULL, 3, e->time); } +#endif if (e->button == 1) { gdk_window_get_device_position(gtk_widget_get_window(w), e->device, &x, &y, &state); @@ -1862,9 +2286,9 @@ static gboolean Stylus_Release(GtkWidget *w, GdkEventButton *e, gpointer data) static void loadgame(int num){ if (desmume_running()) { - Pause(); + Pause(NULL, NULL, NULL); loadstate_slot(num); - Launch(); + Launch(NULL, NULL, NULL); } else loadstate_slot(num); @@ -1874,9 +2298,9 @@ static void loadgame(int num){ static void savegame(int num){ if (desmume_running()) { - Pause(); + Pause(NULL, NULL, NULL); savestate_slot(num); - Launch(); + Launch(NULL, NULL, NULL); } else savestate_slot(num); @@ -1884,14 +2308,14 @@ static void savegame(int num){ RedrawScreen(); } -static void MenuLoad(GtkMenuItem *item, gpointer slot) +static void MenuLoad(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - loadgame(GPOINTER_TO_INT(slot)); + loadgame(g_variant_get_uint32(parameter)); } -static void MenuSave(GtkMenuItem *item, gpointer slot) +static void MenuSave(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - savegame(GPOINTER_TO_INT(slot)); + savegame(g_variant_get_uint32(parameter)); } static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) @@ -1954,7 +2378,7 @@ static void CallbackSetAudioVolume(GtkWidget *scale, gpointer data) config.audio_volume = SNDSDLGetAudioVolume(); } -static void SetAudioVolume() +static void SetAudioVolume(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *dialog = NULL; GtkWidget *scale = NULL; @@ -1985,7 +2409,7 @@ static void CallbackSetFirmwareLanguage(GtkWidget *check_button, gpointer data) gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button))); } -static void SetFirmwareLanguage() +static void SetFirmwareLanguage(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *dialog = NULL; GtkWidget *combo_box_text = NULL; @@ -2078,7 +2502,7 @@ static void Modify_Key(GtkWidget* widget, gpointer data) } -static void Edit_Controls() +static void Edit_Controls(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *ecDialog; GtkWidget *ecKey; @@ -2174,7 +2598,7 @@ static void Modify_JoyKey(GtkWidget* widget, gpointer data) #ifdef HAVE_JIT -static void EmulationSettingsDialog(){ +static void EmulationSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data){ GtkWidget *esDialog; GtkWidget *esKey; @@ -2243,7 +2667,7 @@ static void ToggleJIT(){ #endif -static void Edit_Joystick_Controls() +static void Edit_Joystick_Controls(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *ecDialog; GtkWidget *ecKey; @@ -2283,7 +2707,7 @@ static void Edit_Joystick_Controls() } -static void GraphicsSettingsDialog() { +static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *gsDialog; GtkBox *wBox; GtkGrid *wGrid; @@ -2412,16 +2836,17 @@ static void GraphicsSettingsDialog() { } -static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data) +static void ToggleLayerVisibility(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - guint Layer = GPOINTER_TO_UINT(data); - gboolean active; + guint Layer = GPOINTER_TO_UINT(user_data); // FIXME: make it work after resume if (!desmume_running()) return; - active = gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean active = !g_variant_get_boolean(variant); + g_simple_action_set_state(action, g_variant_new_boolean(active)); switch (Layer) { case MAIN_BG_0: @@ -2443,7 +2868,7 @@ static void ToggleLayerVisibility(GtkToggleAction* action, gpointer data) } } -static void Printscreen() +static void Printscreen(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GdkPixbuf *screenshot; const gchar *dir; @@ -2506,13 +2931,13 @@ static void Printscreen() } #ifdef DESMUME_GTK_FIRMWARE_BROKEN -static void SelectFirmwareFile() +static void SelectFirmwareFile(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_nds, *pFilter_bin, *pFilter_any; GtkFileChooserNative *pFileSelection; BOOL oldState = desmume_running(); - Pause(); + Pause(NULL, NULL, NULL); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.nds"); @@ -2546,28 +2971,106 @@ static void SelectFirmwareFile() } g_object_unref(pFileSelection); - if(oldState) Launch(); + if(oldState) Launch(NULL, NULL, NULL); } #endif -static void Modify_PriInterpolation(GtkAction *action, GtkRadioAction *current) +static void Modify_PriInterpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - uint filter = gtk_radio_action_get_current_value(current) ; - video->ChangeFilterByID((VideoFilterTypeID)filter); + std::string string = g_variant_get_string(parameter, NULL); + VideoFilterTypeID filter; + if (string == "none") + filter = VideoFilterTypeID_None; + else if (string == "lq2x") + filter = VideoFilterTypeID_LQ2X; + else if (string == "lq2xs") + filter = VideoFilterTypeID_LQ2XS; + else if (string == "hq2x") + filter = VideoFilterTypeID_HQ2X; + else if (string == "hq2xs") + filter = VideoFilterTypeID_HQ2XS; + else if (string == "hq3x") + filter = VideoFilterTypeID_HQ3X; + else if (string == "hq3xs") + filter = VideoFilterTypeID_HQ3XS; + else if (string == "hq4x") + filter = VideoFilterTypeID_HQ4X; + else if (string == "hq4xs") + filter = VideoFilterTypeID_HQ4XS; + else if (string == "2xsai") + filter = VideoFilterTypeID_2xSaI; + else if (string == "super2xsai") + filter = VideoFilterTypeID_Super2xSaI; + else if (string == "supereagle") + filter = VideoFilterTypeID_SuperEagle; + else if (string == "scanline") + filter = VideoFilterTypeID_Scanline; + else if (string == "bilinear") + filter = VideoFilterTypeID_Bilinear; + else if (string == "nearest2x") + filter = VideoFilterTypeID_Nearest2X; + else if (string == "nearest_1point5x") + filter = VideoFilterTypeID_Nearest1_5X; + else if (string == "nearestplus_1point5x") + filter = VideoFilterTypeID_NearestPlus1_5X; + else if (string == "epx") + filter = VideoFilterTypeID_EPX; + else if (string == "epxplus") + filter = VideoFilterTypeID_EPXPlus; + else if (string == "epx_1point5x") + filter = VideoFilterTypeID_EPX1_5X; + else if (string == "epxplus_1point5x") + filter = VideoFilterTypeID_EPXPlus1_5X; + else if (string == "2xbrz") + filter = VideoFilterTypeID_2xBRZ; + else if (string == "3xbrz") + filter = VideoFilterTypeID_3xBRZ; + else if (string == "4xbrz") + filter = VideoFilterTypeID_4xBRZ; + else if (string == "5xbrz") + filter = VideoFilterTypeID_5xBRZ; + video->ChangeFilterByID(filter); config.view_filter = filter; RedrawScreen(); + g_simple_action_set_state(action, parameter); } -static void Modify_Interpolation(GtkAction *action, GtkRadioAction *current) +static void Modify_Interpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - Interpolation = (cairo_filter_t)gtk_radio_action_get_current_value(current); + std::string string = g_variant_get_string(parameter, NULL); + cairo_filter_t filter; + if (string == "fast") + filter = CAIRO_FILTER_FAST; + else if (string == "good") + filter = CAIRO_FILTER_GOOD; + else if (string == "best") + filter = CAIRO_FILTER_BEST; + else if (string == "nearest") + filter = CAIRO_FILTER_NEAREST; + else if (string == "bilinear") + filter = CAIRO_FILTER_BILINEAR; + else if (string == "gaussian") + filter = CAIRO_FILTER_GAUSSIAN; + Interpolation = filter; config.view_cairoFilter = Interpolation; RedrawScreen(); + g_simple_action_set_state(action, parameter); } -static void Modify_SPUMode(GtkAction *action, GtkRadioAction *current) +static void Modify_SPUMode(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - const uint mode = gtk_radio_action_get_current_value(current); + const char *string = g_variant_get_string(parameter, NULL); + spumode_enum mode; + if (strcmp(string, "dual-async") == 0) + mode = SPUMODE_DUALASYNC; + else if (strcmp(string, "sync-n") == 0) + mode = SPUMODE_SYNCN; + else if (strcmp(string, "sync-z") == 0) + mode = SPUMODE_SYNCZ; +#ifdef HAVE_LIBSOUNDTOUCH + else if (strcmp(string, "sync-p") == 0) + mode = SPUMODE_SYNCP; +#endif switch (mode) { case SPUMODE_SYNCN: @@ -2586,17 +3089,28 @@ static void Modify_SPUMode(GtkAction *action, GtkRadioAction *current) break; } config.audio_sync = SPUMode; + g_simple_action_set_state(action, parameter); } -static void Modify_SPUInterpolation(GtkAction *action, GtkRadioAction *current) +static void Modify_SPUInterpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - CommonSettings.spuInterpolationMode = (SPUInterpolationMode)gtk_radio_action_get_current_value(current); + const char *string = g_variant_get_string(parameter, NULL); + SPUInterpolationMode mode; + if (strcmp(string, "none") == 0) + mode = SPUInterpolation_None; + else if (strcmp(string, "linear") == 0) + mode = SPUInterpolation_Linear; + else if (strcmp(string, "cosine") == 0) + mode = SPUInterpolation_Cosine; + CommonSettings.spuInterpolationMode = mode; config.audio_interpolation = CommonSettings.spuInterpolationMode; + g_simple_action_set_state(action, parameter); } -static void Modify_Frameskip(GtkAction *action, GtkRadioAction *current) +static void Modify_Frameskip(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - autoFrameskipMax = gtk_radio_action_get_current_value(current) ; + const char *string = g_variant_get_string(parameter, NULL); + autoFrameskipMax = g_ascii_strtoll(string, NULL, 10); config.frameskip = autoFrameskipMax; if (!autoframeskip) { Frameskip = autoFrameskipMax; @@ -2610,9 +3124,9 @@ extern const int dTools_list_size; BOOL *dTools_running; -static void Start_dTool(GtkWidget *widget, gpointer data) +static void Start_dTool(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - int tool = GPOINTER_TO_INT(data); + int tool = g_variant_get_uint32(parameter); if(dTools_running == NULL || dTools_running[tool]) return; @@ -2666,7 +3180,7 @@ public: } }; -static void DoQuit() +static void DoQuit(GSimpleAction *action, GVariant *parameter, gpointer user_data) { emu_halt(EMUHALT_REASON_USER_REQUESTED_HALT, NDSErrorTag_None); if (regMainLoop) { @@ -2825,30 +3339,17 @@ gboolean EmuLoop(gpointer data) return TRUE; } -static void desmume_try_adding_ui(GtkUIManager *self, const char *ui_descr){ - GError *error; - error = NULL; - if (!gtk_ui_manager_add_ui_from_string (self, ui_descr, -1, &error)) - { - g_message ("building menus failed: %s", error->message); - g_error_free (error); - exit (EXIT_FAILURE); - } -} - -static void dui_set_accel_group(gpointer action, gpointer group) { - gtk_action_set_accel_group((GtkAction *)action, (GtkAccelGroup *)group); -} - // The following functions are adapted from the Windows port: // UpdateSaveStateMenu, ResetSaveStateTimes, LoadSaveStateInfo static void UpdateSaveStateMenu(int pos, char* txt) { - char name[64]; - snprintf(name, sizeof(name), "savestate%d", (pos == 0) ? 10 : pos); - gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); - snprintf(name, sizeof(name), "loadstate%d", (pos == 0) ? 10 : pos); - gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); +#if 0 + char name[64]; + snprintf(name, sizeof(name), "savestate%d", (pos == 0) ? 10 : pos); + gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); + snprintf(name, sizeof(name), "loadstate%d", (pos == 0) ? 10 : pos); + gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); +#endif } static void ResetSaveStateTimes() @@ -2875,59 +3376,72 @@ static void LoadSaveStateInfo() } } -static void desmume_gtk_menu_file_saveload_slot (GtkActionGroup *ag) +static void desmume_gtk_menu_file_saveload_slot(GtkApplication *app) { + std::vector entries; for(guint i = 1; i <= 10; i++){ - GtkAction *act; char label[64], name[64], accel[64]; - snprintf(label, sizeof(label), "_%d", i % 10); + snprintf(label, sizeof(label), "%d", i % 10); // Note: GTK+ doesn't handle Shift correctly, so the actual action is // done in Key_Press. The accelerators here are simply visual cues. snprintf(name, sizeof(name), "savestate%d", i); snprintf(accel, sizeof(accel), "F%d", i); - act = gtk_action_new(name, label, NULL, NULL); - g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuSave), GUINT_TO_POINTER(i % 10)); - gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), accel); + GActionEntry entry = {name, MenuSave, "u", label, NULL}; + entries.push_back(entry); snprintf(name, sizeof(name), "loadstate%d", i); snprintf(accel, sizeof(accel), "F%d", i); - act = gtk_action_new(name, label, NULL, NULL); - g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(MenuLoad), GUINT_TO_POINTER(i % 10)); - gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), accel); + entry = {name, MenuLoad, "u", label, NULL}; + entries.push_back(entry); } + g_action_map_add_action_entries(G_ACTION_MAP(app), entries.data(), entries.size(), NULL); } -static void changesavetype(GtkAction *action, GtkRadioAction *current) +static void changesavetype(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - backup_setManualBackupType( gtk_radio_action_get_current_value(current)); + const char *string = g_variant_get_string(parameter, NULL); + int savetype; + if (strcmp(string, "autodetect") == 0) + savetype = 0; + else if (strcmp(string, "eeprom-4k") == 0) + savetype = 1; + else if (strcmp(string, "eeprom-64k") == 0) + savetype = 2; + else if (strcmp(string, "eeprom-512k") == 0) + savetype = 3; + else if (strcmp(string, "fram-256k") == 0) + savetype = 4; + else if (strcmp(string, "flash-2m") == 0) + savetype = 5; + else if (strcmp(string, "flash-4m") == 0) + savetype = 6; + backup_setManualBackupType(savetype); } -static void desmume_gtk_menu_tool_layers (GtkActionGroup *ag) +static void desmume_gtk_menu_tool_layers(GtkApplication *app) { - const char *Layers_Menu[10][2] = { - {"layermainbg0","_0 Main BG 0"}, - {"layermainbg1","_1 Main BG 1"}, - {"layermainbg2","_2 Main BG 2"}, - {"layermainbg3","_3 Main BG 3"}, - {"layermainobj","_4 Main OBJ"}, - {"layersubbg0", "_5 SUB BG 0"}, - {"layersubbg1", "_6 SUB BG 1"}, - {"layersubbg2", "_7 SUB BG 2"}, - {"layersubbg3", "_8 SUB BG 3"}, - {"layersubobj", "_9 SUB OBJ"} + const char *Layers_Menu[10][3] = { + {"0", "layermainbg0","_0 Main BG 0"}, + {"1", "layermainbg1","_1 Main BG 1"}, + {"2", "layermainbg2","_2 Main BG 2"}, + {"3", "layermainbg3","_3 Main BG 3"}, + {"4", "layermainobj","_4 Main OBJ"}, + {"5", "layersubbg0", "_5 SUB BG 0"}, + {"6", "layersubbg1", "_6 SUB BG 1"}, + {"7", "layersubbg2", "_7 SUB BG 2"}, + {"8", "layersubbg3", "_8 SUB BG 3"}, + {"9", "layersubobj", "_9 SUB OBJ"} }; - guint i; - GtkToggleAction *act; - for(i = 0; i< 10; i++){ - act = gtk_toggle_action_new(Layers_Menu[i][0],Layers_Menu[i][1],NULL,NULL); - gtk_toggle_action_set_active(act, TRUE); - g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(ToggleLayerVisibility), GUINT_TO_POINTER(i)); - gtk_action_group_add_action_with_accel(ag, GTK_ACTION(act), NULL); + std::vector entries; + for (int i = 0; i < 10; i++) { + GActionEntry entry = {Layers_Menu[i][1], ToggleLayerVisibility, NULL, "true", NULL}; + entries.push_back(entry); } + g_action_map_add_action_entries(G_ACTION_MAP(app), entries.data(), entries.size(), NULL); } #ifdef HAVE_LIBAGG @@ -2988,7 +3502,7 @@ static void ToggleHudDisplay(GtkToggleAction* action, gpointer data) RedrawScreen(); } -static void desmume_gtk_menu_view_hud (GtkActionGroup *ag) +static void desmume_gtk_menu_view_hud(GtkApplication *app) { const struct { const gchar* name; @@ -3019,9 +3533,11 @@ static void desmume_gtk_menu_view_hud (GtkActionGroup *ag) } #endif -static void ToggleAudio (GtkToggleAction *action) +static void ToggleAudio(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - config.audio_enabled = gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.audio_enabled = value; if (config.audio_enabled) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); driver->AddLine("Audio enabled"); @@ -3030,12 +3546,14 @@ static void ToggleAudio (GtkToggleAction *action) driver->AddLine("Audio disabled"); } RedrawScreen(); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } #ifdef FAKE_MIC -static void ToggleMicNoise (GtkToggleAction *action) +static void ToggleMicNoise(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - BOOL doNoise = (BOOL)gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean doNoise = !g_variant_get_boolean(variant); Mic_DoNoise(doNoise); if (doNoise) @@ -3043,23 +3561,29 @@ static void ToggleMicNoise (GtkToggleAction *action) else driver->AddLine("Fake mic disabled"); RedrawScreen(); + g_simple_action_set_state(action, g_variant_new_boolean(doNoise)); } #endif -static void ToggleFpsLimiter (GtkToggleAction *action) +static void ToggleFpsLimiter(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - config.fpslimiter = (BOOL)gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.fpslimiter = value; if (config.fpslimiter) driver->AddLine("Fps limiter enabled"); else driver->AddLine("Fps limiter disabled"); RedrawScreen(); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } -static void ToggleAutoFrameskip (GtkToggleAction *action) +static void ToggleAutoFrameskip(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - config.autoframeskip = (BOOL)gtk_toggle_action_get_active(action); + GVariant *variant = g_action_get_state(G_ACTION(action)); + gboolean value = !g_variant_get_boolean(variant); + config.autoframeskip = value; if (config.autoframeskip) { autoframeskip = true; @@ -3071,22 +3595,22 @@ static void ToggleAutoFrameskip (GtkToggleAction *action) driver->AddLine("Auto frameskip disabled"); } RedrawScreen(); + g_simple_action_set_state(action, g_variant_new_boolean(value)); } -static void desmume_gtk_menu_tools (GtkActionGroup *ag) +static void desmume_gtk_menu_tools(GtkApplication *app) { - gint i; - for(i = 0; i < dTools_list_size; i++) { - GtkAction *act; - act = gtk_action_new(dTools_list[i]->shortname, dTools_list[i]->name, NULL, NULL); - g_signal_connect(G_OBJECT(act), "activate", G_CALLBACK(Start_dTool), GINT_TO_POINTER(i)); - gtk_action_group_add_action(ag, GTK_ACTION(act)); + std::vector entries; + for (int i = 0; i < dTools_list_size; i++) { + GActionEntry entry = {dTools_list[i]->shortname, Start_dTool, "u", std::to_string(i).c_str(), NULL}; + entries.push_back(entry); } + g_action_map_add_action_entries(G_ACTION_MAP(app), entries.data(), entries.size(), NULL); } static gboolean timeout_exit_cb(gpointer data) { - DoQuit(); + DoQuit(NULL, NULL, NULL); INFO("Quit after %d seconds timeout\n", GPOINTER_TO_INT(data)); return FALSE; @@ -3105,7 +3629,6 @@ common_gtk_main(GApplication *app, gpointer user_data) GtkAccelGroup * accel_group; GtkWidget *pBox; - GtkWidget *pMenuBar; GtkWidget *pToolBar; /* use any language set on the command line */ @@ -3249,11 +3772,10 @@ common_gtk_main(GApplication *app, gpointer user_data) video = new VideoFilter(256, 384, VideoFilterTypeID_None, CommonSettings.num_cores); /* Create the window */ - pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); + pWindow = gtk_application_window_new(GTK_APPLICATION(app)); gtk_window_set_title(GTK_WINDOW(pWindow), "DeSmuME"); gtk_window_set_resizable(GTK_WINDOW (pWindow), TRUE); gtk_window_set_icon(GTK_WINDOW (pWindow), gdk_pixbuf_new_from_xpm_data(DeSmuME_xpm)); - gtk_application_add_window(GTK_APPLICATION(app), GTK_WINDOW(pWindow)); g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(DoQuit), NULL); g_signal_connect(G_OBJECT(pWindow), "key_press_event", G_CALLBACK(Key_Press), NULL); @@ -3263,71 +3785,204 @@ common_gtk_main(GApplication *app, gpointer user_data) pBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(pWindow), pBox); - ui_manager = gtk_ui_manager_new (); accel_group = gtk_accel_group_new(); - action_group = gtk_action_group_new("dui"); - gtk_action_group_add_actions(action_group, action_entries, G_N_ELEMENTS(action_entries), NULL); - gtk_action_group_add_toggle_actions(action_group, toggle_entries, G_N_ELEMENTS(toggle_entries), NULL); /* Update audio toggle status */ if (my_config->disable_sound || !config.audio_enabled) { - GtkAction *action = gtk_action_group_get_action(action_group, "enableaudio"); - if (action) - gtk_toggle_action_set_active((GtkToggleAction *)action, FALSE); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "enableaudio")), g_variant_new_boolean(FALSE)); } - desmume_gtk_menu_tool_layers(action_group); + desmume_gtk_menu_tool_layers(GTK_APPLICATION(app)); #ifdef HAVE_LIBAGG - desmume_gtk_menu_view_hud(action_group); -#else - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "hud_notsupported"), FALSE); + desmume_gtk_menu_view_hud(GTK_APPLICATION(app)); #endif - desmume_gtk_menu_file_saveload_slot(action_group); - desmume_gtk_menu_tools(action_group); - gtk_action_group_add_radio_actions(action_group, savet_entries, G_N_ELEMENTS(savet_entries), - my_config->savetype, G_CALLBACK(changesavetype), NULL); + desmume_gtk_menu_file_saveload_slot(GTK_APPLICATION(app)); + desmume_gtk_menu_tools(GTK_APPLICATION(app)); + std::string string; + switch (my_config->savetype) { + case 0: + string = "autodetect"; + break; + case 1: + string = "eeprom-4k"; + break; + case 2: + string = "eeprom-64k"; + break; + case 3: + string = "eeprom-512k"; + break; + case 4: + string = "fram-256k"; + break; + case 5: + string = "flash-2m"; + break; + case 6: + string = "flash-4m"; + break; + } + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "savetype")), g_variant_new_string(string.c_str())); if (config.view_cairoFilter < CAIRO_FILTER_FAST || config.view_cairoFilter > CAIRO_FILTER_BILINEAR) { config.view_cairoFilter = CAIRO_FILTER_NEAREST; } Interpolation = (cairo_filter_t)config.view_cairoFilter.get(); - gtk_action_group_add_radio_actions(action_group, interpolation_entries, G_N_ELEMENTS(interpolation_entries), - Interpolation, G_CALLBACK(Modify_Interpolation), NULL); + switch (Interpolation) { + case CAIRO_FILTER_FAST: + string = "fast"; + break; + case CAIRO_FILTER_NEAREST: + string = "nearest"; + break; + case CAIRO_FILTER_GOOD: + string = "good"; + break; + case CAIRO_FILTER_BILINEAR: + string = "bilinear"; + break; + case CAIRO_FILTER_BEST: + string = "best"; + break; + } + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "interpolation")), g_variant_new_string(string.c_str())); if (config.view_filter < VideoFilterTypeID_None || config.view_filter >= VideoFilterTypeIDCount) { config.view_filter = VideoFilterTypeID_None; } video->ChangeFilterByID((VideoFilterTypeID)config.view_filter.get()); - gtk_action_group_add_radio_actions(action_group, pri_interpolation_entries, G_N_ELEMENTS(pri_interpolation_entries), - config.view_filter, G_CALLBACK(Modify_PriInterpolation), NULL); + switch (config.view_filter) { + case VideoFilterTypeID_None: + string = "none"; + break; + case VideoFilterTypeID_LQ2X: + string = "lq2x"; + break; + case VideoFilterTypeID_LQ2XS: + string = "lq2xs"; + break; + case VideoFilterTypeID_HQ2X: + string = "hq2x"; + break; + case VideoFilterTypeID_HQ2XS: + string = "hq2xs"; + break; + case VideoFilterTypeID_HQ3X: + string = "hq3x"; + break; + case VideoFilterTypeID_HQ3XS: + string = "hq3xs"; + break; + case VideoFilterTypeID_HQ4X: + string = "hq4x"; + break; + case VideoFilterTypeID_HQ4XS: + string = "hq4xs"; + break; + case VideoFilterTypeID_2xSaI: + string = "2xsai"; + break; + case VideoFilterTypeID_Super2xSaI: + string = "super2xsai"; + break; + case VideoFilterTypeID_SuperEagle: + string = "supereagle"; + break; + case VideoFilterTypeID_Scanline: + string = "scanline"; + break; + case VideoFilterTypeID_Bilinear: + string = "bilinear"; + break; + case VideoFilterTypeID_Nearest2X: + string = "nearest2x"; + break; + case VideoFilterTypeID_Nearest1_5X: + string = "nearest_1point5x"; + break; + case VideoFilterTypeID_NearestPlus1_5X: + string = "nearestplus_1point5x"; + break; + case VideoFilterTypeID_EPX: + string = "epx"; + break; + case VideoFilterTypeID_EPXPlus: + string = "epxplus"; + break; + case VideoFilterTypeID_EPX1_5X: + string = "epx_1point5x"; + break; + case VideoFilterTypeID_EPXPlus1_5X: + string = "epxplus_1point5x"; + break; + case VideoFilterTypeID_2xBRZ: + string = "2xbrz"; + break; + case VideoFilterTypeID_3xBRZ: + string = "3xbrz"; + break; + case VideoFilterTypeID_4xBRZ: + string = "4xbrz"; + break; + case VideoFilterTypeID_5xBRZ: + string = "5xbrz"; + break; + } + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "pri_interpolation")), g_variant_new_string(string.c_str())); + switch (config.audio_sync) { + case SPUMODE_SYNCN: + case SPUMODE_SYNCZ: +#ifdef HAVE_LIBSOUNDTOUCH + case SPUMODE_SYNCP: +#endif + SPUMode = config.audio_sync; + SPU_SetSynchMode(1, config.audio_sync-1); + break; + + case SPUMODE_DUALASYNC: + default: + config.audio_sync = SPUMODE_DUALASYNC; + SPUMode = SPUMODE_DUALASYNC; + SPU_SetSynchMode(0, 0); + break; + } switch (config.audio_sync) { case SPUMODE_SYNCN: + string = "sync-n"; + break; case SPUMODE_SYNCZ: + string = "sync-z"; + break; #ifdef HAVE_LIBSOUNDTOUCH case SPUMODE_SYNCP: -#endif - SPUMode = config.audio_sync; - SPU_SetSynchMode(1, config.audio_sync-1); + string = "sync-p"; break; - +#endif case SPUMODE_DUALASYNC: default: - config.audio_sync = SPUMODE_DUALASYNC; - SPUMode = SPUMODE_DUALASYNC; - SPU_SetSynchMode(0, 0); + string = "dual-async"; break; } - gtk_action_group_add_radio_actions(action_group, spumode_entries, G_N_ELEMENTS(spumode_entries), - config.audio_sync, G_CALLBACK(Modify_SPUMode), NULL); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "spu_mode")), g_variant_new_string(string.c_str())); CommonSettings.spuInterpolationMode = (SPUInterpolationMode)(config.audio_interpolation.get()); - gtk_action_group_add_radio_actions(action_group, spuinterpolation_entries, G_N_ELEMENTS(spuinterpolation_entries), - CommonSettings.spuInterpolationMode, G_CALLBACK(Modify_SPUInterpolation), NULL); + switch (CommonSettings.spuInterpolationMode) { + case SPUInterpolation_None: + string = "none"; + break; + case SPUInterpolation_Linear: + string = "linear"; + break; + case SPUInterpolation_Cosine: + string = "cosine"; + break; + } + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "spu_interpolation")), g_variant_new_string(string.c_str())); - gtk_action_group_add_radio_actions(action_group, frameskip_entries, G_N_ELEMENTS(frameskip_entries), - config.frameskip, G_CALLBACK(Modify_Frameskip), NULL); + string = std::to_string(config.frameskip); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "frameskip")), g_variant_new_string(string.c_str())); autoFrameskipMax = config.frameskip; - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "frameskipA"), config.autoframeskip); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "frameskipA")), g_variant_new_boolean(config.autoframeskip)); if (config.autoframeskip) { autoframeskip = true; Frameskip = 0; @@ -3347,53 +4002,81 @@ common_gtk_main(GApplication *app, gpointer user_data) break; } nds_screen.rotation_angle = config.view_rot; - gtk_action_group_add_radio_actions(action_group, rotation_entries, G_N_ELEMENTS(rotation_entries), - nds_screen.rotation_angle, G_CALLBACK(SetRotation), NULL); + string = std::to_string(nds_screen.rotation_angle); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "rotate")), g_variant_new_string(string.c_str())); if (config.window_scale < WINSIZE_SCALE || config.window_scale > WINSIZE_5) { config.window_scale = WINSIZE_SCALE; } winsize_current = (winsize_enum)config.window_scale.get(); - gtk_action_group_add_radio_actions(action_group, winsize_entries, G_N_ELEMENTS(winsize_entries), - winsize_current, G_CALLBACK(SetWinsize), NULL); + switch (winsize_current) { + case WINSIZE_SCALE: + string = "scale"; + break; + case WINSIZE_HALF: + string = "0.5"; + break; + case WINSIZE_1: + string = "1"; + break; + case WINSIZE_1HALF: + string = "1.5"; + break; + case WINSIZE_2: + string = "2"; + break; + case WINSIZE_2HALF: + string = "2.5"; + break; + case WINSIZE_3: + string = "3"; + break; + case WINSIZE_4: + string = "4"; + break; + case WINSIZE_5: + string = "5"; + break; + } + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "winsize")), g_variant_new_string(string.c_str())); if (config.view_orient < ORIENT_VERTICAL || config.view_orient > ORIENT_SINGLE) { config.view_orient = ORIENT_VERTICAL; } nds_screen.orientation = (orientation_enum)config.view_orient.get(); - gtk_action_group_add_radio_actions(action_group, orientation_entries, G_N_ELEMENTS(orientation_entries), - nds_screen.orientation, G_CALLBACK(SetOrientation), NULL); - - { - GList * list = gtk_action_group_list_actions(action_group); - g_list_foreach(list, dui_set_accel_group, accel_group); + switch (nds_screen.orientation) { + case ORIENT_VERTICAL: + string = "vertical"; + break; + case ORIENT_HORIZONTAL: + string = "horizontal"; + break; + case ORIENT_SINGLE: + string = "single"; + break; } - gtk_window_add_accel_group(GTK_WINDOW(pWindow), accel_group); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "pause"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "run"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "reset"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "printscreen"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatlist"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "cheatsearch"), FALSE); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "orient")), g_variant_new_string(string.c_str())); + + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "pause")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "run")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "reset")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "printscreen")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "cheatlist")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "cheatsearch")), FALSE); nds_screen.gap_size = config.view_gap ? GAP_SIZE : 0; nds_screen.swap = config.view_swap; - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "orient_swapscreens"), config.view_swap); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "swapscreens")), g_variant_new_boolean(config.view_swap)); - gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); - - accel_group = gtk_ui_manager_get_accel_group (ui_manager); - gtk_window_add_accel_group (GTK_WINDOW (pWindow), accel_group); - - desmume_try_adding_ui(ui_manager, ui_description); - - pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); - gtk_box_pack_start (GTK_BOX(pBox), pMenuBar, FALSE, FALSE, 0); - pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); - gtk_box_pack_start (GTK_BOX(pBox), pToolBar, FALSE, FALSE, 0); + GtkBuilder *builder = gtk_builder_new_from_string(menu_builder, -1); + GMenuModel *menubar = G_MENU_MODEL(gtk_builder_get_object(builder, "menubar")); + gtk_application_set_menubar(GTK_APPLICATION(app), menubar); + g_object_unref(builder); + pApp = GTK_APPLICATION(app); +#if 0 { GtkWidget * recentMenu = gtk_ui_manager_get_widget (ui_manager, "/MainMenu/FileMenu/RecentMenu"); GtkWidget * recentFiles = gtk_recent_chooser_menu_new(); @@ -3403,12 +4086,13 @@ common_gtk_main(GApplication *app, gpointer user_data) gtk_menu_item_set_submenu(GTK_MENU_ITEM(recentMenu), recentFiles); g_signal_connect(G_OBJECT(recentFiles), "item-activated", G_CALLBACK(OpenRecent), NULL); } +#endif /* Creating the place for showing DS screens */ pDrawingArea = gtk_drawing_area_new(); /* This toggle action must not be set active before the pDrawingArea initialization to avoid a GTK warning */ - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "gap"), config.view_gap); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "gap")), g_variant_new_boolean(config.view_gap)); gtk_container_add (GTK_CONTAINER(pBox), pDrawingArea); @@ -3437,37 +4121,35 @@ common_gtk_main(GApplication *app, gpointer user_data) if (winsize_current == WINSIZE_SCALE) { if (config.window_fullscreen) { - gtk_widget_hide(pMenuBar); + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(pWindow), FALSE); gtk_widget_hide(pToolBar); gtk_widget_hide(pStatusBar); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_menu"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "view_menu")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "view_toolbar")), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "view_statusbar")), FALSE); gtk_window_fullscreen(GTK_WINDOW(pWindow)); } } else { config.window_fullscreen = false; - gtk_action_set_sensitive(gtk_action_group_get_action(action_group, "fullscreen"), FALSE); + g_simple_action_set_enabled(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "fullscreen")), FALSE); } if (!config.view_menu) { - gtk_widget_hide(pMenuBar); - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_menu"), FALSE); + gtk_application_window_set_show_menubar(GTK_APPLICATION_WINDOW(pWindow), FALSE); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "view_menu")), g_variant_new_boolean(FALSE)); } if (!config.view_toolbar) { gtk_widget_hide(pToolBar); - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_toolbar"), FALSE); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "view_toolbar")), g_variant_new_boolean(FALSE)); } if (!config.view_statusbar) { gtk_widget_hide(pStatusBar); - gtk_toggle_action_set_active((GtkToggleAction*)gtk_action_group_get_action(action_group, "view_statusbar"), FALSE); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "view_statusbar")), g_variant_new_boolean(FALSE)); } UpdateDrawingAreaAspect(); if (my_config->disable_limiter || !config.fpslimiter) { config.fpslimiter = false; - GtkAction *action = gtk_action_group_get_action(action_group, "enablefpslimiter"); - if (action) - gtk_toggle_action_set_active((GtkToggleAction *)action, FALSE); + g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "enablefpslimiter")), g_variant_new_boolean(FALSE)); } #if defined(HAVE_OPENGL) && defined(OGLRENDER_3_2_H) @@ -3541,7 +4223,7 @@ common_gtk_main(GApplication *app, gpointer user_data) loadstate_slot(my_config->load_slot); } - Launch(); + Launch(NULL, NULL, NULL); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, @@ -3621,6 +4303,9 @@ int main (int argc, char *argv[]) // TODO: pass G_APPLICATION_HANDLES_COMMAND_LINE instead. GtkApplication *app = gtk_application_new("org.desmume.DeSmuME", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK(common_gtk_main), &my_config); + g_action_map_add_action_entries(G_ACTION_MAP(app), + app_entries, G_N_ELEMENTS(app_entries), + app); if ( !fill_configured_features( &my_config, argv)) { exit(0); diff --git a/desmume/src/frontend/posix/gtk/main.h b/desmume/src/frontend/posix/gtk/main.h index b64706d67..8bb31279e 100644 --- a/desmume/src/frontend/posix/gtk/main.h +++ b/desmume/src/frontend/posix/gtk/main.h @@ -1,7 +1,7 @@ #ifndef __DESMUME_GTK_MAIN_H__ #define __DESMUME_GTK_MAIN_H__ -void Pause(); -void Launch(); +void Pause(GSimpleAction *action, GVariant *parameter, gpointer user_data); +void Launch(GSimpleAction *action, GVariant *parameter, gpointer user_data); #endif From 74cd070e61b5024ed97c2a7fbe88318d05f3d20f Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Sun, 30 Aug 2020 01:25:55 +0200 Subject: [PATCH 23/26] GTK: Reimplement the toolbar using GtkBuilder --- desmume/src/frontend/posix/gtk/main.cpp | 52 ++++++++++++++++++++----- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index dcd386f09..66cb8324a 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -963,6 +963,42 @@ static const GActionEntry app_entries[] = { { "about", About }, }; +static const char *toolbar = +"" +"" +" " +" " +" " +" " +" _Open" +" document-open" +" app.open" +" " +" " +" " +" " +" _Run" +" media-playback-start" +" app.run" +" " +" " +" " +" " +" _Pause" +" media-playback-pause" +" app.pause" +" " +" " +" " +" " +" _Quit" +" application-exit" +" app.quit" +" " +" " +" " +""; + static const char *graphics_settings = "" "" @@ -1305,6 +1341,7 @@ cairo_filter_t Interpolation = CAIRO_FILTER_NEAREST; static GtkApplication *pApp; static GtkWidget *pWindow; +static GtkWidget *pToolBar; static GtkWidget *pStatusBar; static GtkWidget *pDrawingArea; @@ -1363,9 +1400,6 @@ static void ToggleMenuVisible(GSimpleAction *action, GVariant *parameter, gpoint static void ToggleToolbarVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data) { -#if 0 - GtkWidget *pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); - GVariant *variant = g_action_get_state(G_ACTION(action)); gboolean value = !g_variant_get_boolean(variant); config.view_toolbar = value; @@ -1374,7 +1408,6 @@ static void ToggleToolbarVisible(GSimpleAction *action, GVariant *parameter, gpo else gtk_widget_hide(pToolBar); g_simple_action_set_state(action, g_variant_new_boolean(value)); -#endif } static void ToggleStatusbarVisible(GSimpleAction *action, GVariant *parameter, gpointer user_data) @@ -1391,7 +1424,6 @@ static void ToggleStatusbarVisible(GSimpleAction *action, GVariant *parameter, g static void ToggleFullscreen(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - GtkWidget *pToolBar = NULL; //gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); GVariant *variant = g_action_get_state(G_ACTION(action)); gboolean fullscreen = !g_variant_get_boolean(variant); config.window_fullscreen = fullscreen; @@ -3627,9 +3659,7 @@ common_gtk_main(GApplication *app, gpointer user_data) SDL_TimerID limiter_timer = NULL; - GtkAccelGroup * accel_group; GtkWidget *pBox; - GtkWidget *pToolBar; /* use any language set on the command line */ if ( my_config->firmware_language != -1) { @@ -3785,7 +3815,11 @@ common_gtk_main(GApplication *app, gpointer user_data) pBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(pWindow), pBox); - accel_group = gtk_accel_group_new(); + /* Create the toolbar */ + GtkBuilder *builder = gtk_builder_new_from_string(toolbar, -1); + pToolBar = GTK_WIDGET(gtk_builder_get_object(builder, "toolbar")); + gtk_container_add(GTK_CONTAINER(pBox), pToolBar); + g_object_unref(builder); /* Update audio toggle status */ if (my_config->disable_sound || !config.audio_enabled) { @@ -4070,7 +4104,7 @@ common_gtk_main(GApplication *app, gpointer user_data) nds_screen.swap = config.view_swap; g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "swapscreens")), g_variant_new_boolean(config.view_swap)); - GtkBuilder *builder = gtk_builder_new_from_string(menu_builder, -1); + builder = gtk_builder_new_from_string(menu_builder, -1); GMenuModel *menubar = G_MENU_MODEL(gtk_builder_get_object(builder, "menubar")); gtk_application_set_menubar(GTK_APPLICATION(app), menubar); g_object_unref(builder); From 5629855183ab4c1ee1c44a73a7a2b5b53955a752 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 1 Sep 2020 03:10:02 +0200 Subject: [PATCH 24/26] =?UTF-8?q?GTK:=20Properly=20guard=20HUD=20function?= =?UTF-8?q?=20when=20AGG=20isn=E2=80=99t=20found?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- desmume/src/frontend/posix/gtk/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 66cb8324a..31f5f52b2 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -170,7 +170,9 @@ static void Modify_PriInterpolation(GSimpleAction *action, GVariant *parameter, static void Modify_Interpolation(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void SetOrientation(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void ToggleLayerVisibility(GSimpleAction *action, GVariant *parameter, gpointer user_data); +#ifdef HAVE_LIBAGG static void ToggleHudDisplay(GtkToggleAction* action, gpointer data); +#endif #ifdef DESMUME_GTK_FIRMWARE_BROKEN static void SelectFirmwareFile(GSimpleAction *action, GVariant *parameter, gpointer user_data); #endif From 7435ffaefd4a9a49e3b9de09a1a24aa4e9779539 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 9 Sep 2020 22:44:25 +0200 Subject: [PATCH 25/26] GTK: Restore savestate menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is now using an action parameter to send the slot to save to/load from. There was a previous comment about Shift-Fn being broken and a workaround using Key_Press(), but it doesn’t seem to be broken anymore so we can use the accelerators instead and remove a static variable. --- desmume/src/frontend/posix/gtk/main.cpp | 199 +++++++++++++++++------- 1 file changed, 143 insertions(+), 56 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 31f5f52b2..a0e127cd2 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -226,9 +226,133 @@ static const char *menu_builder = " " " " " _Save state" +"
" +" " +" _1" +" app.savestate" +" 1" +" <Shift>F1" +" " +" " +" _2" +" app.savestate" +" 2" +" <Shift>F2" +" " +" " +" _3" +" app.savestate" +" 3" +" <Shift>F3" +" " +" " +" _4" +" app.savestate" +" 4" +" <Shift>F4" +" " +" " +" _5" +" app.savestate" +" 5" +" <Shift>F5" +" " +" " +" _6" +" app.savestate" +" 6" +" <Shift>F6" +" " +" " +" _7" +" app.savestate" +" 7" +" <Shift>F7" +" " +" " +" _8" +" app.savestate" +" 8" +" <Shift>F8" +" " +" " +" _9" +" app.savestate" +" 9" +" <Shift>F9" +" " +" " +" 1_0" +" app.savestate" +" 0" +" <Shift>F10" +" " +"
" "
" " " " _Load state" +"
" +" " +" _1" +" app.loadstate" +" 1" +" F1" +" " +" " +" _2" +" app.loadstate" +" 2" +" F2" +" " +" " +" _3" +" app.loadstate" +" 3" +" F3" +" " +" " +" _4" +" app.loadstate" +" 4" +" F4" +" " +" " +" _5" +" app.loadstate" +" 5" +" F5" +" " +" " +" _6" +" app.loadstate" +" 6" +" F6" +" " +" " +" _7" +" app.loadstate" +" 7" +" F7" +" " +" " +" _8" +" app.loadstate" +" 8" +" F8" +" " +" " +" _9" +" app.loadstate" +" 9" +" F9" +" " +" " +" 1_0" +" app.loadstate" +" 0" +" F10" +" " +"
" "
" " " "
" @@ -911,6 +1035,8 @@ static const GActionEntry app_entries[] = { { "reset", Reset }, { "savestateto", SaveStateDialog }, { "loadstatefrom", LoadStateDialog }, + { "savestate", MenuSave, "u" }, + { "loadstate", MenuLoad, "u" }, { "recordmovie", RecordMovieDialog }, { "playmovie", PlayMovieDialog }, { "stopmovie", StopMovie }, @@ -1191,7 +1317,6 @@ struct modify_key_ctx { }; static u16 keys_latch = 0; -static u16 gdk_shift_pressed = 0; u16 Keypad_Temp[NB_KEYS]; class configured_features : public CommandLine @@ -2354,21 +2479,6 @@ static void MenuSave(GSimpleAction *action, GVariant *parameter, gpointer user_d static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) { - if (e->keyval == GDK_KEY_Shift_L){ - gdk_shift_pressed |= 1; - return 1; - } - if (e->keyval == GDK_KEY_Shift_R){ - gdk_shift_pressed |= 2; - return 1; - } - if( e->keyval >= GDK_KEY_F1 && e->keyval <= GDK_KEY_F10 ){ - if(!gdk_shift_pressed) - loadgame((e->keyval - GDK_KEY_F1 + 1) % 10); - else - savegame((e->keyval - GDK_KEY_F1 + 1) % 10); - return 1; - } guint mask; mask = gtk_accelerator_get_default_mod_mask (); if( (e->state & mask) == 0){ @@ -2390,14 +2500,6 @@ static gint Key_Press(GtkWidget *w, GdkEventKey *e, gpointer data) static gint Key_Release(GtkWidget *w, GdkEventKey *e, gpointer data) { - if (e->keyval == GDK_KEY_Shift_L){ - gdk_shift_pressed &= ~1; - return 1; - } - if (e->keyval == GDK_KEY_Shift_R){ - gdk_shift_pressed &= ~2; - return 1; - } u16 Key = lookup_key(e->keyval); RM_KEY( keys_latch, Key ); return 1; @@ -3373,17 +3475,25 @@ gboolean EmuLoop(gpointer data) return TRUE; } +GMenuModel *savestates_menu; +GMenuModel *loadstates_menu; + // The following functions are adapted from the Windows port: // UpdateSaveStateMenu, ResetSaveStateTimes, LoadSaveStateInfo static void UpdateSaveStateMenu(int pos, char* txt) { -#if 0 - char name[64]; - snprintf(name, sizeof(name), "savestate%d", (pos == 0) ? 10 : pos); - gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); - snprintf(name, sizeof(name), "loadstate%d", (pos == 0) ? 10 : pos); - gtk_action_set_label(gtk_action_group_get_action(action_group, name), txt); -#endif + GMenuItem *item; + gint position = ((pos == 0) ? 10 : pos) - 1; + + item = g_menu_item_new_from_model(savestates_menu, position); + g_menu_item_set_label(item, txt); + g_menu_remove(G_MENU(savestates_menu), position); + g_menu_insert_item(G_MENU(savestates_menu), position, item); + + item = g_menu_item_new_from_model(loadstates_menu, position); + g_menu_item_set_label(item, txt); + g_menu_remove(G_MENU(loadstates_menu), position); + g_menu_insert_item(G_MENU(loadstates_menu), position, item); } static void ResetSaveStateTimes() @@ -3410,30 +3520,6 @@ static void LoadSaveStateInfo() } } -static void desmume_gtk_menu_file_saveload_slot(GtkApplication *app) -{ - std::vector entries; - for(guint i = 1; i <= 10; i++){ - char label[64], name[64], accel[64]; - - snprintf(label, sizeof(label), "%d", i % 10); - - // Note: GTK+ doesn't handle Shift correctly, so the actual action is - // done in Key_Press. The accelerators here are simply visual cues. - - snprintf(name, sizeof(name), "savestate%d", i); - snprintf(accel, sizeof(accel), "F%d", i); - GActionEntry entry = {name, MenuSave, "u", label, NULL}; - entries.push_back(entry); - - snprintf(name, sizeof(name), "loadstate%d", i); - snprintf(accel, sizeof(accel), "F%d", i); - entry = {name, MenuLoad, "u", label, NULL}; - entries.push_back(entry); - } - g_action_map_add_action_entries(G_ACTION_MAP(app), entries.data(), entries.size(), NULL); -} - static void changesavetype(GSimpleAction *action, GVariant *parameter, gpointer user_data) { const char *string = g_variant_get_string(parameter, NULL); @@ -3831,7 +3917,6 @@ common_gtk_main(GApplication *app, gpointer user_data) #ifdef HAVE_LIBAGG desmume_gtk_menu_view_hud(GTK_APPLICATION(app)); #endif - desmume_gtk_menu_file_saveload_slot(GTK_APPLICATION(app)); desmume_gtk_menu_tools(GTK_APPLICATION(app)); std::string string; switch (my_config->savetype) { @@ -4108,6 +4193,8 @@ common_gtk_main(GApplication *app, gpointer user_data) builder = gtk_builder_new_from_string(menu_builder, -1); GMenuModel *menubar = G_MENU_MODEL(gtk_builder_get_object(builder, "menubar")); + savestates_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "savestates")); + loadstates_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "loadstates")); gtk_application_set_menubar(GTK_APPLICATION(app), menubar); g_object_unref(builder); pApp = GTK_APPLICATION(app); From a1ea27d7f94e68ea02e68e08a4d7f51f0676c541 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 9 Sep 2020 22:50:28 +0200 Subject: [PATCH 26/26] GTK: Restore the open recent submenu This now only uses GtkRecentManager to populate the menu. --- desmume/src/frontend/posix/gtk/main.cpp | 44 ++++++++++++++++--------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index a0e127cd2..662a5299b 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -133,6 +133,7 @@ static void RecordMovieDialog(GSimpleAction *action, GVariant *parameter, gpoint static void PlayMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void StopMovie(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void OpenNdsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void OpenRecent(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void SaveStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void LoadStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); void Launch(GSimpleAction *action, GVariant *parameter, gpointer user_data); @@ -195,7 +196,7 @@ static const char *menu_builder = " app.open" " <Control>o" " " -" " +" " " Open _recent" " " "
" @@ -1030,6 +1031,7 @@ static const char *menu_builder = static const GActionEntry app_entries[] = { // File { "open", OpenNdsDialog }, + { "recent", OpenRecent, "s" }, { "run", Launch }, { "pause", Pause }, { "reset", Reset }, @@ -1996,16 +1998,16 @@ static void OpenNdsDialog(GSimpleAction *action, GVariant *parameter, gpointer u g_object_unref(pFileSelection); } -static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) +static void OpenRecent(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkRecentManager *recent_manager = gtk_recent_manager_get_default(); - gchar *uri, *romname; + gchar *romname; int ret; if (desmume_running()) Pause(NULL, NULL, NULL); - uri = gtk_recent_chooser_get_current_uri(chooser); + const char *uri = g_variant_get_string(parameter, NULL); romname = g_filename_from_uri(uri, NULL, NULL); ret = Open(romname); if (ret > 0) { @@ -2022,7 +2024,6 @@ static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) gtk_widget_destroy(pDialog); } - g_free(uri); g_free(romname); } @@ -4193,23 +4194,34 @@ common_gtk_main(GApplication *app, gpointer user_data) builder = gtk_builder_new_from_string(menu_builder, -1); GMenuModel *menubar = G_MENU_MODEL(gtk_builder_get_object(builder, "menubar")); + GMenuModel *open_recent_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "open_recent")); savestates_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "savestates")); loadstates_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "loadstates")); gtk_application_set_menubar(GTK_APPLICATION(app), menubar); g_object_unref(builder); pApp = GTK_APPLICATION(app); -#if 0 - { - GtkWidget * recentMenu = gtk_ui_manager_get_widget (ui_manager, "/MainMenu/FileMenu/RecentMenu"); - GtkWidget * recentFiles = gtk_recent_chooser_menu_new(); - GtkRecentFilter * recentFilter = gtk_recent_filter_new(); - gtk_recent_filter_add_mime_type(recentFilter, "application/x-nintendo-ds-rom"); - gtk_recent_chooser_set_filter(GTK_RECENT_CHOOSER(recentFiles), recentFilter); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(recentMenu), recentFiles); - g_signal_connect(G_OBJECT(recentFiles), "item-activated", G_CALLBACK(OpenRecent), NULL); - } -#endif + GtkRecentManager *manager = gtk_recent_manager_get_default(); + GList *items = gtk_recent_manager_get_items(manager); + g_list_foreach(items, [](gpointer data, gpointer user_data) { + // TODO: Why is there no GTK_RECENT_INFO()?! + GtkRecentInfo *info = static_cast(data); + const char *mime = gtk_recent_info_get_mime_type(info); + if (strcmp(mime, "application/x-nintendo-ds-rom") != 0) { + gtk_recent_info_unref(info); + return; + } + + const char *uri = gtk_recent_info_get_uri(info); + const char *name = gtk_recent_info_get_display_name(info); + // TODO: Is that enough? Maybe allocate instead? + char action[1024]; + sprintf(action, "app.recent('%s')", uri); + g_menu_append(G_MENU(open_recent_menu), name, action); + + gtk_recent_info_unref(info); + }, NULL); + g_list_free(items); /* Creating the place for showing DS screens */ pDrawingArea = gtk_drawing_area_new();