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/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/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 index 4b16980b3..796bfb0d6 --- 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-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/cheatsGTK.cpp b/desmume/src/frontend/posix/gtk/cheatsGTK.cpp index 6045bdfdb..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() @@ -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 *hbbox = gtk_hbutton_box_new(); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); + GtkWidget *hbbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); 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); @@ -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); @@ -352,15 +352,15 @@ void CheatList () static void cheat_search_create_ui() { GtkWidget *button; - GtkWidget *vbox = gtk_vbox_new(FALSE, 1); - GtkWidget *hbbox = gtk_hbutton_box_new(); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 1); + GtkWidget *hbbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); 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,18 +417,18 @@ 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() { } -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 7216798ab..662a5299b 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -26,8 +26,11 @@ #include #include #include +#include #include #include +#include +#include #include "types.h" #include "firmware.h" @@ -120,395 +123,1118 @@ 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 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); +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); +#ifdef HAVE_LIBAGG static void ToggleHudDisplay(GtkToggleAction* action, gpointer data); +#endif #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" +"
" +" " +" _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" +" " +"
" +"
" +"
" +"
" +" " +" 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 GActionEntry app_entries[] = { + // File + { "open", OpenNdsDialog }, + { "recent", OpenRecent, "s" }, + { "run", Launch }, + { "pause", Pause }, + { "reset", Reset }, + { "savestateto", SaveStateDialog }, + { "loadstatefrom", LoadStateDialog }, + { "savestate", MenuSave, "u" }, + { "loadstate", MenuLoad, "u" }, + { "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 }, + + // 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" }, + + // 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 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 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 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 }, -}; - -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 }, -}; +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, @@ -524,18 +1250,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, @@ -544,12 +1258,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; @@ -568,57 +1276,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, @@ -636,21 +1293,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; @@ -662,7 +1319,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 @@ -812,11 +1468,11 @@ uint autoFrameskipMax = 0; bool autoframeskip = true; cairo_filter_t Interpolation = CAIRO_FILTER_NEAREST; +static GtkApplication *pApp; static GtkWidget *pWindow; +static GtkWidget *pToolBar; static GtkWidget *pStatusBar; static GtkWidget *pDrawingArea; -static GtkActionGroup * action_group; -static GtkUIManager *ui_manager; struct nds_screen_t { guint gap_size; @@ -829,7 +1485,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) { @@ -840,7 +1496,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); @@ -862,61 +1518,60 @@ 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) { - 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)); } -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); + 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) { - GdkColor black = {0, 0, 0, 0}; - gtk_widget_modify_bg(pDrawingArea, GTK_STATE_NORMAL, &black); - - 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 { - gtk_widget_modify_bg(pDrawingArea, GTK_STATE_NORMAL, NULL); - 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); @@ -924,9 +1579,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)); } } @@ -939,56 +1594,52 @@ 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(); 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 ..."); - 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; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); @@ -999,26 +1650,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,28 +1673,21 @@ 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); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } -static void RecordMovieDialog() +static void RecordMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_dsm, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); @@ -1058,49 +1698,39 @@ 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() +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; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_dsm = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_dsm, "*.dsm*"); @@ -1111,46 +1741,35 @@ 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() +static void SaveStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_ds, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_ds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_ds, "*.ds*"); @@ -1161,27 +1780,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,28 +1804,21 @@ 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); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + 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; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_mkv = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_mkv, "*.mkv"); @@ -1225,30 +1833,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); + 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(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1258,24 +1862,17 @@ static void RecordAV_x264() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + g_object_unref(pFileSelection); } -static void RecordAV_flac() +static void RecordAV_flac(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkFileFilter *pFilter_flac, *pFilter_any; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_flac = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_flac, "*.flac"); @@ -1286,29 +1883,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); + 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(pFileSelection), + GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, @@ -1318,31 +1911,24 @@ static void RecordAV_flac() } g_free(sPath); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + 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; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; if (desmume_running()) - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.[nN][dD][sS]"); @@ -1363,14 +1949,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); @@ -1379,11 +1961,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, @@ -1405,33 +1989,30 @@ 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); - break; - default: - break; } - gtk_widget_destroy(pFileSelection); + 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(); + 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) { - 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), @@ -1443,18 +2024,17 @@ static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) gtk_widget_destroy(pDialog); } - g_free(uri); 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); } } @@ -1492,48 +2072,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) @@ -1635,7 +2246,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); @@ -1661,7 +2273,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; @@ -1767,7 +2379,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_device_position(gtk_widget_get_window(w), e->device, &x, &y, &state); else { x= (gint)e->x; y= (gint)e->y; @@ -1796,14 +2408,16 @@ 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_pointer(w->window, &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 @@ -1832,9 +2446,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); @@ -1844,9 +2458,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); @@ -1854,33 +2468,18 @@ 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) { - if (e->keyval == GDK_Shift_L){ - gdk_shift_pressed |= 1; - return 1; - } - if (e->keyval == GDK_Shift_R){ - gdk_shift_pressed |= 2; - return 1; - } - if( e->keyval >= GDK_F1 && e->keyval <= GDK_F10 ){ - if(!gdk_shift_pressed) - loadgame((e->keyval - GDK_F1 + 1) % 10); - else - savegame((e->keyval - GDK_F1 + 1) % 10); - return 1; - } guint mask; mask = gtk_accelerator_get_default_mod_mask (); if( (e->state & mask) == 0){ @@ -1902,14 +2501,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_Shift_L){ - gdk_shift_pressed &= ~1; - return 1; - } - if (e->keyval == GDK_Shift_R){ - gdk_shift_pressed &= ~2; - return 1; - } u16 Key = lookup_key(e->keyval); RM_KEY( keys_latch, Key ); return 1; @@ -1918,23 +2509,23 @@ 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() +static void SetAudioVolume(GSimpleAction *action, GVariant *parameter, gpointer user_data) { 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, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_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(dialog)->vbox), hscale, TRUE, FALSE, 0); - gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); + dialog = gtk_dialog_new_with_buttons("Set audio volume", GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, "_OK", GTK_RESPONSE_OK, "_Cancel", GTK_RESPONSE_CANCEL, NULL); + 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))) { case GTK_RESPONSE_OK: @@ -1955,14 +2546,14 @@ 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; 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]); @@ -1971,9 +2562,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: @@ -2019,17 +2610,17 @@ 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); 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: @@ -2048,7 +2639,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; @@ -2060,8 +2651,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++) { @@ -2069,10 +2660,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: @@ -2114,14 +2705,14 @@ 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); 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); @@ -2144,33 +2735,33 @@ 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; 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"); - 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); + 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(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" @@ -2180,9 +2771,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; @@ -2204,7 +2795,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(){ @@ -2213,7 +2804,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; @@ -2225,8 +2816,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++) { @@ -2234,10 +2825,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: @@ -2253,118 +2844,68 @@ static void Edit_Joystick_Controls() } -static void GraphicsSettingsDialog() { +static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data) { 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), GTK_DIALOG_MODAL, - GTK_STOCK_OK, + "_OK", GTK_RESPONSE_OK, - GTK_STOCK_CANCEL, + "_Cancel", 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(gsDialog)->vbox), wTable, TRUE, FALSE, 0); - - // 3D Core - gsKey = gtk_label_new("3D Core:"); - gtk_misc_set_alignment(GTK_MISC(gsKey), 0.0, 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_misc_set_alignment(GTK_MISC(gsKey), 0.0, 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_misc_set_alignment(GTK_MISC(gsKey), 0.0, 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(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: // 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) @@ -2400,7 +2941,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; @@ -2410,12 +2951,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]; @@ -2432,16 +2973,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: @@ -2463,7 +3005,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; @@ -2526,17 +3068,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; - GtkWidget *pFileSelection; - GtkWidget *pParent; - gchar *sPath; + GtkFileChooserNative *pFileSelection; BOOL oldState = desmume_running(); - Pause(); - - pParent = GTK_WIDGET(pWindow); + Pause(NULL, NULL, NULL); pFilter_nds = gtk_file_filter_new(); gtk_file_filter_add_pattern(pFilter_nds, "*.nds"); @@ -2550,52 +3088,126 @@ 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(); + 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: @@ -2614,17 +3226,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; @@ -2638,9 +3261,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; @@ -2694,10 +3317,14 @@ public: } }; -static void DoQuit() +static void DoQuit(GSimpleAction *action, GVariant *parameter, gpointer user_data) { 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)); } @@ -2716,7 +3343,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; } @@ -2846,30 +3476,25 @@ 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); -} +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) { - 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); + 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() @@ -2896,59 +3521,48 @@ static void LoadSaveStateInfo() } } -static void desmume_gtk_menu_file_saveload_slot (GtkActionGroup *ag) +static void changesavetype(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - for(guint i = 1; i <= 10; i++){ - GtkAction *act; - 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); - 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); - - 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); - } + 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 changesavetype(GtkAction *action, GtkRadioAction *current) +static void desmume_gtk_menu_tool_layers(GtkApplication *app) { - backup_setManualBackupType( gtk_radio_action_get_current_value(current)); -} - -static void desmume_gtk_menu_tool_layers (GtkActionGroup *ag) -{ - 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 @@ -3009,7 +3623,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; @@ -3040,9 +3654,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"); @@ -3051,12 +3667,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) @@ -3064,23 +3682,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; @@ -3092,40 +3716,39 @@ 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; } -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(); SDL_TimerID limiter_timer = NULL; - GtkAccelGroup * accel_group; - GtkWidget *pVBox; - GtkWidget *pMenuBar; - GtkWidget *pToolBar; + GtkWidget *pBox; /* use any language set on the command line */ if ( my_config->firmware_language != -1) { @@ -3197,7 +3820,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); @@ -3250,7 +3874,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) @@ -3265,7 +3891,7 @@ common_gtk_main( class configured_features *my_config) 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)); @@ -3274,75 +3900,211 @@ 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(); - action_group = gtk_action_group_new("dui"); + /* 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); - 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_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; @@ -3362,70 +4124,112 @@ common_gtk_main( class configured_features *my_config) 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); + 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); - desmume_try_adding_ui(ui_manager, ui_description); + 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; + } - pMenuBar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu"); - gtk_box_pack_start (GTK_BOX (pVBox), pMenuBar, FALSE, FALSE, 0); - pToolBar = gtk_ui_manager_get_widget (ui_manager, "/ToolBar"); - gtk_box_pack_start (GTK_BOX(pVBox), pToolBar, FALSE, FALSE, 0); + 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); - { - 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); - } + gtk_recent_info_unref(info); + }, NULL); + g_list_free(items); /* 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 (pVBox), pDrawingArea); + gtk_container_add (GTK_CONTAINER(pBox), pDrawingArea); gtk_widget_set_events(pDrawingArea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | @@ -3438,7 +4242,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 ) ; @@ -3446,43 +4250,41 @@ 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); 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) @@ -3556,7 +4358,7 @@ common_gtk_main( class configured_features *my_config) loadstate_slot(my_config->load_slot); } - Launch(); + Launch(NULL, NULL, NULL); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, @@ -3581,9 +4383,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(); @@ -3614,11 +4416,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; @@ -3636,7 +4435,12 @@ 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); + 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); @@ -3648,23 +4452,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 - 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 diff --git a/desmume/src/frontend/posix/gtk/meson.build b/desmume/src/frontend/posix/gtk/meson.build new file mode 100644 index 000000000..a920416b9 --- /dev/null +++ b/desmume/src/frontend/posix/gtk/meson.build @@ -0,0 +1,38 @@ +dep_gtk3 = dependency('gtk+-3.0') +dep_x11 = dependency('x11') + +gtk_dependencies = dependencies + [dep_gtk3, 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/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]); 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', +) 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