diff --git a/0002-Integrate-a-native-file-chooser-into-BlastEm-using-X.patch b/0002-Integrate-a-native-file-chooser-into-BlastEm-using-X.patch new file mode 100644 index 0000000..85a10aa --- /dev/null +++ b/0002-Integrate-a-native-file-chooser-into-BlastEm-using-X.patch @@ -0,0 +1,209 @@ +From e0ad37e6fe205d0ff701458403e1c83e5000c912 Mon Sep 17 00:00:00 2001 +From: techmetx11 +Date: Mon, 2 Feb 2026 23:51:58 +0100 +Subject: [PATCH] Integrate a native file chooser into BlastEm using XDG + desktop portal API (for Flatpak) + +Add filters to the file chooser +--- + Makefile | 15 +--- + default.cfg | 2 +- + nuklear_ui/filechooser_xdg.c | 145 +++++++++++++++++++++++++++++++++++ + 3 files changed, 148 insertions(+), 14 deletions(-) + create mode 100644 nuklear_ui/filechooser_xdg.c + +diff --git a/Makefile b/Makefile +index 6bb9be0..66d0204 100644 +--- a/Makefile ++++ b/Makefile +@@ -93,21 +93,10 @@ Z80_DISPATCH:=call + else #CPU=wasm + FONT:=nuklear_ui/font.o + ifneq ($(MAKECMDGOALS),libblastem.$(SO)) +-CHOOSER:=nuklear_ui/filechooser_gtk.o +-GTKFLAGS:=$(shell pkg-config --cflags gtk+-3.0 2>/dev/null) +-ifeq ($(GTKFLAGS),) +-GTKFLAGS:=$(shell pkg-config --cflags gtk+-2.0 2>/dev/null) +-ifeq ($(GTKFLAGS),) +-CHOOSER:=nuklear_ui/filechooser_null.o +-endif +-endif ++CHOOSER:=nuklear_ui/filechooser_xdg.o ++LIBS+= libportal + endif #neq ($(MAKECMDGOALS),libblastem.$(SO)) + endif #CPU=wasm +-ifeq ($(GTKFLAGS),) +-else +-EXTRA_NUKLEAR_LDFLAGS:=-ldl +-endif +-CFLAGS+= $(GTKFLAGS) + endif #Darwin + + ifdef HOST_ZLIB +diff --git a/default.cfg b/default.cfg +index 73df736..7a22f1c 100644 +--- a/default.cfg ++++ b/default.cfg +@@ -412,7 +412,7 @@ ui { + #specifies the preferred save-state format, set to gst for Genecyst compatible states + state_format native + #set to on to use the native file picker on your OS instead of the builtin one +- use_native_filechooser off ++ use_native_filechooser on + } + + system { +diff --git a/nuklear_ui/filechooser_xdg.c b/nuklear_ui/filechooser_xdg.c +new file mode 100644 +index 0000000..bd90286 +--- /dev/null ++++ b/nuklear_ui/filechooser_xdg.c +@@ -0,0 +1,145 @@ ++#include ++#include ++ ++#include ++#include ++ ++static XdpPortal *portal = NULL; ++typedef struct { ++ GMainLoop *loop; ++ char *uri; ++} FileChooserData; ++ ++uint8_t native_filechooser_available(void) ++{ ++ return 1; ++} ++ ++void native_filechooser_callback(GObject *obj, GAsyncResult *res, gpointer data) { ++ FileChooserData *fcdata = data; ++ GVariant *var = xdp_portal_open_file_finish(portal, res, NULL); ++ if (!var) { ++ fcdata->uri = NULL; ++ g_main_loop_quit(fcdata->loop); ++ return; ++ } ++ ++ GVariant *uris = g_variant_lookup_value(var, "uris", G_VARIANT_TYPE_STRING_ARRAY); ++ ++ GVariant *first_uri = g_variant_get_child_value(uris, 0); ++ gsize length = 0; ++ ++ const gchar *uri_string = g_variant_dup_string(first_uri, &length); ++ ++ gchar *unespaced_uri = g_filename_from_uri(uri_string, NULL, NULL); ++ fcdata->uri = strndup(unespaced_uri, length); ++ ++ g_free(unespaced_uri); ++ g_main_loop_quit(fcdata->loop); ++} ++ ++char* native_filechooser_pick(const char *title, const char *start_directory) ++{ ++ if (!portal) { ++ portal = xdp_portal_new(); ++ } ++ FileChooserData data; ++ GMainContext *context = g_main_context_new(); ++ GMainLoop *loop = g_main_loop_new(context, FALSE); ++ GCancellable *cancellable = g_cancellable_new(); ++ ++ g_main_context_push_thread_default(context); ++ ++ data.loop = loop; ++ ++ // Filter builder ++ GVariantBuilder filters; ++ GVariantBuilder allfiles_filter; ++ GVariantBuilder allsupported_filter; ++ GVariantBuilder gen_filter; ++ GVariantBuilder scd_filter; ++ GVariantBuilder sms_filter; ++ GVariantBuilder vgm_filter; ++ ++ g_variant_builder_init(&filters, G_VARIANT_TYPE("a(sa(us))")); ++ g_variant_builder_init(&allfiles_filter, G_VARIANT_TYPE("a(us)")); ++ ++ g_variant_builder_add(&allfiles_filter, "(us)", 0, "*"); ++ ++ g_variant_builder_init(&allsupported_filter, G_VARIANT_TYPE("a(us)")); ++ ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.zip"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.bin"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.bin.gz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.gen"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.gen.gz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.md"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.md.gz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.sms"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.sms.gz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.gg"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.gg.gz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.sg"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.sg.gz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.cue"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.toc"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.flac"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.vgm"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.vgz"); ++ g_variant_builder_add(&allsupported_filter, "(us)", 0, "*.vgm.gz"); ++ ++ g_variant_builder_init(&gen_filter, G_VARIANT_TYPE("a(us)")); ++ ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.zip"); ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.bin"); ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.bin.gz"); ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.gen"); ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.gen.gz"); ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.md"); ++ g_variant_builder_add(&gen_filter, "(us)", 0, "*.md.gz"); ++ ++ g_variant_builder_init(&scd_filter, G_VARIANT_TYPE("a(us)")); ++ ++ g_variant_builder_add(&scd_filter, "(us)", 0, "*.cue"); ++ g_variant_builder_add(&scd_filter, "(us)", 0, "*.toc"); ++ ++ g_variant_builder_init(&sms_filter, G_VARIANT_TYPE("a(us)")); ++ ++ g_variant_builder_add(&sms_filter, "(us)", 0, "*.sms"); ++ g_variant_builder_add(&sms_filter, "(us)", 0, "*.sms.gz"); ++ g_variant_builder_add(&sms_filter, "(us)", 0, "*.gg"); ++ g_variant_builder_add(&sms_filter, "(us)", 0, "*.gg.gz"); ++ g_variant_builder_add(&sms_filter, "(us)", 0, "*.sg"); ++ g_variant_builder_add(&sms_filter, "(us)", 0, "*.sg.gz"); ++ ++ g_variant_builder_init(&vgm_filter, G_VARIANT_TYPE("a(us)")); ++ ++ g_variant_builder_add(&vgm_filter, "(us)", 0, "*.flac"); ++ g_variant_builder_add(&vgm_filter, "(us)", 0, "*.vgm"); ++ g_variant_builder_add(&vgm_filter, "(us)", 0, "*.vgz"); ++ g_variant_builder_add(&vgm_filter, "(us)", 0, "*.vgm.gz"); ++ ++ g_variant_builder_add(&filters, "(sa(us))", "All Files", &allfiles_filter); ++ g_variant_builder_add(&filters, "(sa(us))", "All Supported Files", &allsupported_filter); ++ g_variant_builder_add(&filters, "(sa(us))", "Genesis/MD", &gen_filter); ++ g_variant_builder_add(&filters, "(sa(us))", "Sega/Mega CD", &scd_filter); ++ g_variant_builder_add(&filters, "(sa(us))", "Sega 8-bit", &sms_filter); ++ g_variant_builder_add(&filters, "(sa(us))", "Audio/VGM", &vgm_filter); ++ ++ GVariant *filters_var = g_variant_builder_end(&filters); ++ ++ // Set Genesis/MD as the default filter ++ xdp_portal_open_file(portal, NULL, title, filters_var, g_variant_get_child_value(filters_var, 2), NULL, 0, cancellable, native_filechooser_callback, &data); ++ ++ g_main_loop_run(loop); ++ g_main_context_pop_thread_default(context); ++ ++ if (g_cancellable_is_cancelled(cancellable)) { ++ data.uri = NULL; ++ } ++ ++ g_main_loop_unref(loop); ++ g_main_context_unref(context); ++ ++ return data.uri; ++} +-- +2.52.0 + diff --git a/com.retrodev.blastem.appdata.xml b/com.retrodev.blastem.appdata.xml index e33f866..3a9b856 100644 --- a/com.retrodev.blastem.appdata.xml +++ b/com.retrodev.blastem.appdata.xml @@ -3,7 +3,7 @@ com.retrodev.blastem com.retrodev.blastem.desktop - Blastem + BlastEm A Sega Mega Drive/Genesis, and Master System emulator CC0-1.0 GPL-3.0+ @@ -17,6 +17,7 @@

https://www.retrodev.com/blastem/ + https://www.retrodev.com/repos/blastem https://raw.githubusercontent.com/flathub/com.retrodev.blastem/master/screenshots/blastem-1.png diff --git a/com.retrodev.blastem.json b/com.retrodev.blastem.json index d9a4b29..5c57195 100644 --- a/com.retrodev.blastem.json +++ b/com.retrodev.blastem.json @@ -12,12 +12,30 @@ /* Joystick and GPU access */ "--device=all", /* Get access to the files */ - "--filesystem=home:ro", "--filesystem=xdg-run/gvfs:ro" ], "modules" : [ "shared-modules/glu/glu-9.json", "shared-modules/glew/glew.json", + { + "name": "libportal", + "buildsystem": "meson", + "config-opts": [ + "-Dbackend-gtk3=disabled", + "-Dbackend-gtk4=disabled", + "-Dbackend-qt5=disabled", + "-Dbackend-qt6=disabled", + "-Dvapi=false", + "-Ddocs=false", + "-Dtests=false" + ], + "sources": [ + { + "type": "git", + "url": "https://github.com/flatpak/libportal.git", + "commit": "086cc57372989117cfb6ef4c565bdd316db2e536" + }] + }, { "name" : "blastem", "buildsystem" : "simple", @@ -26,7 +44,7 @@ "install -m0755 -D blastem /app/bin/blastem.bin", "install -m0755 -D blastem.sh /app/bin/blastem", "install -d /app/share/blastem/", - "cp -r shaders/ images/ gamecontrollerdb.txt rom.db /app/share/blastem/", + "cp -r shaders/ images/ gamecontrollerdb.txt rom.db systems.cfg /app/share/blastem/", "install -m0644 -D default.cfg /app/etc/default.cfg", "install -m0644 -D ${FLATPAK_ID}.png /app/share/icons/hicolor/256x256/apps/${FLATPAK_ID}.png", "install -m0644 -D com.retrodev.blastem.desktop /app/share/applications/com.retrodev.blastem.desktop", @@ -35,8 +53,8 @@ "sources" : [ { "type" : "archive", - "url" : "https://www.retrodev.com/repos/blastem/archive/0013362c320c.tar.bz2", - "sha256" : "4e6a937097c868471507d59e4a5a6f0da8b06af44ee9f3d05d530c5348b2ad9b" + "url" : "https://www.retrodev.com/repos/blastem/archive/0b220095659f.tar.bz2", + "sha256" : "7e02e3ee6547ddb81f049f8b99d1a17288c916cdb169365e60ae91bad33b0f0c" }, { "type" : "script", @@ -49,7 +67,8 @@ { "type" : "patch", "paths" : [ - "0001-Add-support-for-Flatpak-config-data-dir-variables.patch" + "0001-Add-support-for-Flatpak-config-data-dir-variables.patch", + "0002-Integrate-a-native-file-chooser-into-BlastEm-using-X.patch" ] }, { diff --git a/flathub.json b/flathub.json index c22dc7d..e461637 100644 --- a/flathub.json +++ b/flathub.json @@ -1,6 +1,5 @@ { "only-arches": [ - "x86_64", - "i386" + "x86_64" ] }