diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index a0e127cd2..662a5299b 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -133,6 +133,7 @@ static void RecordMovieDialog(GSimpleAction *action, GVariant *parameter, gpoint static void PlayMovieDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void StopMovie(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void OpenNdsDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); +static void OpenRecent(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void SaveStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void LoadStateDialog(GSimpleAction *action, GVariant *parameter, gpointer user_data); void Launch(GSimpleAction *action, GVariant *parameter, gpointer user_data); @@ -195,7 +196,7 @@ static const char *menu_builder = " app.open" " <Control>o" " " -" " +" " " Open _recent" " " " " @@ -1030,6 +1031,7 @@ static const char *menu_builder = static const GActionEntry app_entries[] = { // File { "open", OpenNdsDialog }, + { "recent", OpenRecent, "s" }, { "run", Launch }, { "pause", Pause }, { "reset", Reset }, @@ -1996,16 +1998,16 @@ static void OpenNdsDialog(GSimpleAction *action, GVariant *parameter, gpointer u g_object_unref(pFileSelection); } -static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) +static void OpenRecent(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkRecentManager *recent_manager = gtk_recent_manager_get_default(); - gchar *uri, *romname; + gchar *romname; int ret; if (desmume_running()) Pause(NULL, NULL, NULL); - uri = gtk_recent_chooser_get_current_uri(chooser); + const char *uri = g_variant_get_string(parameter, NULL); romname = g_filename_from_uri(uri, NULL, NULL); ret = Open(romname); if (ret > 0) { @@ -2022,7 +2024,6 @@ static void OpenRecent(GtkRecentChooser *chooser, gpointer user_data) gtk_widget_destroy(pDialog); } - g_free(uri); g_free(romname); } @@ -4193,23 +4194,34 @@ common_gtk_main(GApplication *app, gpointer user_data) builder = gtk_builder_new_from_string(menu_builder, -1); GMenuModel *menubar = G_MENU_MODEL(gtk_builder_get_object(builder, "menubar")); + GMenuModel *open_recent_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "open_recent")); savestates_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "savestates")); loadstates_menu = G_MENU_MODEL(gtk_builder_get_object(builder, "loadstates")); gtk_application_set_menubar(GTK_APPLICATION(app), menubar); g_object_unref(builder); pApp = GTK_APPLICATION(app); -#if 0 - { - GtkWidget * recentMenu = gtk_ui_manager_get_widget (ui_manager, "/MainMenu/FileMenu/RecentMenu"); - GtkWidget * recentFiles = gtk_recent_chooser_menu_new(); - GtkRecentFilter * recentFilter = gtk_recent_filter_new(); - gtk_recent_filter_add_mime_type(recentFilter, "application/x-nintendo-ds-rom"); - gtk_recent_chooser_set_filter(GTK_RECENT_CHOOSER(recentFiles), recentFilter); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(recentMenu), recentFiles); - g_signal_connect(G_OBJECT(recentFiles), "item-activated", G_CALLBACK(OpenRecent), NULL); - } -#endif + GtkRecentManager *manager = gtk_recent_manager_get_default(); + GList *items = gtk_recent_manager_get_items(manager); + g_list_foreach(items, [](gpointer data, gpointer user_data) { + // TODO: Why is there no GTK_RECENT_INFO()?! + GtkRecentInfo *info = static_cast(data); + const char *mime = gtk_recent_info_get_mime_type(info); + if (strcmp(mime, "application/x-nintendo-ds-rom") != 0) { + gtk_recent_info_unref(info); + return; + } + + const char *uri = gtk_recent_info_get_uri(info); + const char *name = gtk_recent_info_get_display_name(info); + // TODO: Is that enough? Maybe allocate instead? + char action[1024]; + sprintf(action, "app.recent('%s')", uri); + g_menu_append(G_MENU(open_recent_menu), name, action); + + gtk_recent_info_unref(info); + }, NULL); + g_list_free(items); /* Creating the place for showing DS screens */ pDrawingArea = gtk_drawing_area_new();