diff --git a/desmume/src/frontend/posix/gtk/desmume.gresource.xml b/desmume/src/frontend/posix/gtk/desmume.gresource.xml
index d26c2f730..7d02489f2 100644
--- a/desmume/src/frontend/posix/gtk/desmume.gresource.xml
+++ b/desmume/src/frontend/posix/gtk/desmume.gresource.xml
@@ -3,6 +3,7 @@
org.desmume.DeSmuME.svg
main.ui
+ menu.ui
graphics.ui
diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp
index 3c8a25633..57a0db6a6 100644
--- a/desmume/src/frontend/posix/gtk/main.cpp
+++ b/desmume/src/frontend/posix/gtk/main.cpp
@@ -193,860 +193,6 @@ static void JITMaxBlockSizeChanged(GtkAdjustment* adj,void *);
#endif
static void GraphicsSettingsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data);
-static const char *menu_builder =
-""
-""
-" "
-"";
-
static const GActionEntry app_entries[] = {
// File
{ "open", OpenNdsDialog },
@@ -4190,14 +3336,42 @@ common_gtk_main(GApplication *app, gpointer user_data)
nds_screen.swap = config.view_swap;
g_simple_action_set_state(G_SIMPLE_ACTION(g_action_map_lookup_action(G_ACTION_MAP(app), "swapscreens")), g_variant_new_boolean(config.view_swap));
- builder = gtk_builder_new_from_string(menu_builder, -1);
+ builder = gtk_builder_new_from_resource("/org/desmume/DeSmuME/menu.ui");
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"));
+ GMenu *config_menu = G_MENU(gtk_builder_get_object(builder, "config"));
+
+#ifdef FAKE_MIC
+ GMenuItem *mic_noise = g_menu_item_new("Fake mic _noise", "app.micnoise");
+ g_menu_insert_item(config_menu, 3, mic_noise);
+#endif
+
+#ifdef HAVE_JIT
+ GMenuItem *emulation_settings = g_menu_item_new("Em_ulation Settings", "app.emulationsettings");
+ g_menu_insert_item(config_menu, 1, emulation_settings);
+#endif
+
+#ifdef HAVE_LIBSOUNDTOUCH
+ GMenu *audio_sync_menu = G_MENU(gtk_builder_get_object(builder, "audio-synchronisation"));
+ GMenuItem *sync_p = g_menu_item_new("Synchronous (_P)", "app.spu_mode(\"sync-p\")");
+ g_menu_append_item(audio_sync_menu, sync_p);
+#endif
+
+ GMenu *view_menu = G_MENU(gtk_builder_get_object(builder, "view"));
+ GMenuModel *hud = G_MENU_MODEL(gtk_builder_get_object(builder,
+#ifdef HAVE_LIBAGG
+ "hud_supported"
+#else
+ "hud_unsupported"
+#endif
+ ));
+ g_menu_append_submenu(view_menu, "_HUD", hud);
+
gtk_application_set_menubar(GTK_APPLICATION(app), menubar);
g_object_unref(builder);
- pApp = GTK_APPLICATION(app);
+ pApp = GTK_APPLICATION(app);
GtkRecentManager *manager = gtk_recent_manager_get_default();
GList *items = gtk_recent_manager_get_items(manager);
diff --git a/desmume/src/frontend/posix/gtk/menu.ui b/desmume/src/frontend/posix/gtk/menu.ui
new file mode 100644
index 000000000..c640ff149
--- /dev/null
+++ b/desmume/src/frontend/posix/gtk/menu.ui
@@ -0,0 +1,845 @@
+
+
+
+
+
+