From 6913c470767323a2626246809016868f1a80486a Mon Sep 17 00:00:00 2001 From: Maximilian Mader Date: Sat, 11 Apr 2020 18:24:55 +0200 Subject: [PATCH] [GTK3] Add UI skeleton --- .gitignore | 10 +- Makefile | 66 +- gtk3/main.c | 264 ++++ gtk3/resources/gtk/menus-common.ui | 422 ++++++ gtk3/resources/gtk/menus-traditional.ui | 30 + gtk3/resources/gtk/menus.ui | 30 + gtk3/resources/pixmaps/CPU.png | Bin 0 -> 18330 bytes gtk3/resources/pixmaps/Display.png | Bin 0 -> 19795 bytes gtk3/resources/pixmaps/Joypad.png | Bin 0 -> 19966 bytes gtk3/resources/pixmaps/Speaker.png | Bin 0 -> 18543 bytes gtk3/resources/pixmaps/logo/logo_128.png | Bin 0 -> 6878 bytes gtk3/resources/pixmaps/logo/logo_16.png | Bin 0 -> 974 bytes gtk3/resources/pixmaps/logo/logo_256.png | Bin 0 -> 16022 bytes gtk3/resources/pixmaps/logo/logo_32.png | Bin 0 -> 1434 bytes gtk3/resources/pixmaps/logo/logo_48.png | Bin 0 -> 2213 bytes gtk3/resources/pixmaps/logo/logo_64.png | Bin 0 -> 2838 bytes gtk3/resources/ui/window.ui | 1610 ++++++++++++++++++++++ gtk3/sameboy.gresource.xml | 46 + 18 files changed, 2469 insertions(+), 9 deletions(-) create mode 100644 gtk3/main.c create mode 100644 gtk3/resources/gtk/menus-common.ui create mode 100644 gtk3/resources/gtk/menus-traditional.ui create mode 100644 gtk3/resources/gtk/menus.ui create mode 100644 gtk3/resources/pixmaps/CPU.png create mode 100644 gtk3/resources/pixmaps/Display.png create mode 100644 gtk3/resources/pixmaps/Joypad.png create mode 100644 gtk3/resources/pixmaps/Speaker.png create mode 100644 gtk3/resources/pixmaps/logo/logo_128.png create mode 100644 gtk3/resources/pixmaps/logo/logo_16.png create mode 100644 gtk3/resources/pixmaps/logo/logo_256.png create mode 100644 gtk3/resources/pixmaps/logo/logo_32.png create mode 100644 gtk3/resources/pixmaps/logo/logo_48.png create mode 100644 gtk3/resources/pixmaps/logo/logo_64.png create mode 100644 gtk3/resources/ui/window.ui create mode 100644 gtk3/sameboy.gresource.xml diff --git a/.gitignore b/.gitignore index c795b05..ab1a14e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,9 @@ -build \ No newline at end of file +build + +# intermediate source files generated at build time +gtk3/sameboy-gtk3-resources.c +gtk3/resources/gtk3/ + +# temporary backup file +*.*~ + diff --git a/Makefile b/Makefile index 36a893d..394084a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Make hacks -.INTERMEDIATE: +.INTERMEDIATE: gtk3/sameboy-gtk3-resources.c # Set target, configuration, version and destination folders @@ -87,8 +87,8 @@ ifeq ($(PLATFORM),Darwin) OPEN_DIALOG = OpenDialog/cocoa.m endif - CFLAGS += -Werror -Wall -Wpartial-availability -Wno-nonnull -Wno-unused-result -Wno-strict-aliasing -Wno-unknown-warning -Wno-unknown-warning-option -Wno-multichar -Wno-int-in-bool-context -std=gnu11 -D_GNU_SOURCE -DVERSION="$(VERSION)" -I. -D_USE_MATH_DEFINES + ifeq (,$(PKG_CONFIG)) SDL_CFLAGS := $(shell sdl2-config --cflags) SDL_LDFLAGS := $(shell sdl2-config --libs) @@ -102,6 +102,16 @@ else GL_CFLAGS := $(shell $(PKG_CONFIG) --cflags gl) GL_LDFLAGS := $(shell $(PKG_CONFIG) --libs gl || echo -lGL) endif + +ifeq (,$(PKG_CONFIG)) +ifneq ($(findstring gtk3,$(MAKECMDGOALS)),) +$(error The gtk3 target requires pkg-config) +endif +else +GTK3_CFLAGS := $(shell $(PKG_CONFIG) --cflags gtk+-3.0) -DGTK_DISABLE_DEPRECATED=1 -DG_DISABLE_DEPRECATED=1 +GTK3_LDFLAGS := $(shell $(PKG_CONFIG) --libs gtk+-3.0) +endif + ifeq ($(PLATFORM),windows32) CFLAGS += -IWindows -Drandom=rand LDFLAGS += -lmsvcrt -lcomdlg32 -luser32 -lSDL2main -Wl,/MANIFESTFILE:NUL @@ -109,6 +119,7 @@ SDL_LDFLAGS := -lSDL2 GL_LDFLAGS := -lopengl32 else LDFLAGS += -lc -lm -ldl +GTK3_LDFLAGS += -Wl -rdynamic endif ifeq ($(PLATFORM),Darwin) @@ -156,6 +167,7 @@ endif cocoa: $(BIN)/SameBoy.app quicklook: $(BIN)/SameBoy.qlgenerator sdl: $(SDL_TARGET) $(BIN)/SDL/dmg_boot.bin $(BIN)/SDL/cgb_boot.bin $(BIN)/SDL/agb_boot.bin $(BIN)/SDL/sgb_boot.bin $(BIN)/SDL/sgb2_boot.bin $(BIN)/SDL/LICENSE $(BIN)/SDL/registers.sym $(BIN)/SDL/background.bmp $(BIN)/SDL/Shaders +gtk3: $(BIN)/gtk3/sameboy bootroms: $(BIN)/BootROMs/agb_boot.bin $(BIN)/BootROMs/cgb_boot.bin $(BIN)/BootROMs/dmg_boot.bin $(BIN)/BootROMs/sgb_boot.bin $(BIN)/BootROMs/sgb2_boot.bin tester: $(TESTER_TARGET) $(BIN)/tester/dmg_boot.bin $(BIN)/tester/cgb_boot.bin $(BIN)/tester/agb_boot.bin $(BIN)/tester/sgb_boot.bin $(BIN)/tester/sgb2_boot.bin all: cocoa sdl tester libretro @@ -164,6 +176,7 @@ all: cocoa sdl tester libretro CORE_SOURCES := $(shell ls Core/*.c) SDL_SOURCES := $(shell ls SDL/*.c) $(OPEN_DIALOG) +GTK3_SOURCES := $(shell ls gtk3/*.c) gtk3/sameboy-gtk3-resources.c TESTER_SOURCES := $(shell ls Tester/*.c) ifeq ($(PLATFORM),Darwin) @@ -179,6 +192,7 @@ CORE_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(CORE_SOURCES)) COCOA_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(COCOA_SOURCES)) QUICKLOOK_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(QUICKLOOK_SOURCES)) SDL_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(SDL_SOURCES)) +GTK3_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(GTK3_SOURCES)) TESTER_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(TESTER_SOURCES)) # Automatic dependency generation @@ -188,6 +202,9 @@ ifneq ($(filter-out clean bootroms libretro %.bin, $(MAKECMDGOALS)),) ifneq ($(filter $(MAKECMDGOALS),sdl),) -include $(SDL_OBJECTS:.o=.dep) endif +ifneq ($(filter $(MAKECMDGOALS),gtk3),) +-include $(GTK3_OBJECTS:.o=.gtk3dep) +endif ifneq ($(filter $(MAKECMDGOALS),tester),) -include $(TESTER_OBJECTS:.o=.dep) endif @@ -200,6 +217,16 @@ $(OBJ)/SDL/%.dep: SDL/% -@$(MKDIR) -p $(dir $@) $(CC) $(CFLAGS) $(SDL_CFLAGS) $(GL_CFLAGS) -MT $(OBJ)/$^.o -M $^ -c -o $@ +gtk3/sameboy-gtk3-resources.c: gtk3/sameboy.gresource.xml $(shell glib-compile-resources --sourcedir=gtk3/resources --generate-dependencies gtk3/sameboy.gresource.xml) + glib-compile-resources --sourcedir=gtk3/resources --target=$@ --generate-source $< + # Resource hack cleanup + rm -rf gtk3/resources/gtk3 + +# GTK3 requires special CFLAGS +$(OBJ)/gtk3/%.gtk3dep: % + -@$(MKDIR) -p $(dir $@) + $(CC) $(CFLAGS) $(GTK3_CFLAGS) -MT $(OBJ)/$^.o -M $^ -c -o $@ + $(OBJ)/%.dep: % -@$(MKDIR) -p $(dir $@) $(CC) $(CFLAGS) -MT $(OBJ)/$^.o -M $^ -c -o $@ @@ -214,15 +241,20 @@ $(OBJ)/SDL/%.c.o: SDL/%.c -@$(MKDIR) -p $(dir $@) $(CC) $(CFLAGS) $(SDL_CFLAGS) $(GL_CFLAGS) -c $< -o $@ +# GTK3 requires special CFLAGS +$(OBJ)/gtk3/%.c.o: gtk3/%.c + -@$(MKDIR) -p $(dir $@) + $(CC) $(CFLAGS) $(GTK3_CFLAGS) -c $< -o $@ + $(OBJ)/%.c.o: %.c -@$(MKDIR) -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ - + # HexFiend requires more flags $(OBJ)/HexFiend/%.m.o: HexFiend/%.m -@$(MKDIR) -p $(dir $@) $(CC) $(CFLAGS) $(OCFLAGS) -c $< -o $@ -fno-objc-arc -include HexFiend/HexFiend_2_Framework_Prefix.pch - + $(OBJ)/%.m.o: %.m -@$(MKDIR) -p $(dir $@) $(CC) $(CFLAGS) $(OCFLAGS) -c $< -o $@ @@ -260,7 +292,7 @@ endif $(BIN)/SameBoy.app/Contents/Resources/Base.lproj/%.nib: Cocoa/%.xib ibtool --compile $@ $^ - + # Quick Look generator $(BIN)/SameBoy.qlgenerator: $(BIN)/SameBoy.qlgenerator/Contents/MacOS/SameBoyQL \ @@ -282,7 +314,7 @@ $(BIN)/SameBoy.qlgenerator/Contents/MacOS/SameBoyQL: $(CORE_OBJECTS) $(QUICKLOOK $(BIN)/SameBoy.qlgenerator/Contents/Resources/cgb_boot_fast.bin: $(BIN)/BootROMs/cgb_boot_fast.bin -@$(MKDIR) -p $(dir $@) cp -f $^ $@ - + # SDL Port # Unix versions build only one binary @@ -293,7 +325,7 @@ ifeq ($(CONF), release) $(STRIP) $@ endif -# Windows version builds two, one with a conole and one without it +# Windows version builds two, one with a console and one without it $(BIN)/SDL/sameboy.exe: $(CORE_OBJECTS) $(SDL_OBJECTS) $(OBJ)/Windows/resources.o -@$(MKDIR) -p $(dir $@) $(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS) $(GL_LDFLAGS) -Wl,/subsystem:windows @@ -309,7 +341,7 @@ $(OBJ)/%.o: %.rc else $(OBJ)/%.res: %.rc -@$(MKDIR) -p $(dir $@) - rc /fo $@ /dVERSION=\"$(VERSION)\" $^ + rc /fo $@ /dVERSION=\"$(VERSION)\" $^ %.o: %.res cvtres /OUT:"$@" $^ @@ -320,6 +352,15 @@ $(BIN)/SDL/SDL2.dll: @$(eval MATCH := $(shell where $$LIB:SDL2.dll)) cp "$(MATCH)" $@ +# GTK3 + +$(BIN)/gtk3/sameboy: $(CORE_OBJECTS) $(GTK3_OBJECTS) + -@$(MKDIR) -p $(dir $@) + $(CC) $^ -o $@ $(LDFLAGS) $(GTK3_LDFLAGS) +ifeq ($(CONF), release) + strip $@ +endif + # Tester $(BIN)/tester/sameboy_tester: $(CORE_OBJECTS) $(TESTER_OBJECTS) @@ -357,6 +398,15 @@ $(BIN)/SDL/Shaders: Shaders -@$(MKDIR) -p $@ cp -rf Shaders/*.fsh $@ +# Fugly resource hack +gtk3/resources/bootroms/%.bin: $(BOOTROMS_DIR)/%.bin + -@$(MKDIR) -p gtk3/resources/gtk3/resources/bootroms/ + cp -f $< gtk3/resources/$@ + +gtk3/resources/Shaders/%.fsh: Shaders/%.fsh + -@$(MKDIR) -p gtk3/resources/gtk3/resources/Shaders/ + cp -rf $< gtk3/resources/$@ + # Boot ROMs $(OBJ)/%.1bpp: %.png diff --git a/gtk3/main.c b/gtk3/main.c new file mode 100644 index 0000000..ddfa699 --- /dev/null +++ b/gtk3/main.c @@ -0,0 +1,264 @@ +#include +#include +#include +#include +#include +#include + +#define str(x) #x +#define xstr(x) str(x) + +#define RESOURCE_PREFIX "/io/github/sameboy/" +#define APP_ID "io.github.sameboy" + +GtkBuilder *builder; +GtkWindow *main_window; +GtkGLArea *gl_area; + +GB_gameboy_t gb; + +typedef struct UserData { + bool fullscreen; + GFile *file; +} UserData; + +// Determines if a ComboBox entry should be converted into a separator. +// Each element with a text value of `` will be converted into a separator element. +static gboolean is_separator(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { + gchar *text = NULL; + + gtk_tree_model_get(model, iter, 0, &text, -1); + gboolean result = g_strcmp0("", text) == 0; + + return result; +} + +// Recursively goes through all children of the given container and sets +// our `is_separator` function to all children of type`GtkComboBox` +static void set_combo_box_row_separator_func(GtkContainer *container) { + GList *list = gtk_container_get_children(container); + + while (list) { + if (GTK_IS_COMBO_BOX(list->data)) { + gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(list->data), is_separator, NULL, NULL); + } + + if (GTK_IS_CONTAINER(list->data)) { + set_combo_box_row_separator_func(GTK_CONTAINER(list->data)); + } + + list = list->next; + } + + g_list_free_full(list, NULL); +} + +// Returns true if the application should show a menubar +static gboolean show_menubar(void) { + GtkSettings *settings = gtk_settings_get_default(); + gboolean result; + + g_object_get(settings, "gtk-shell-shows-menubar", &result, NULL); + + return result; +} + +// Returns a GObject by ID from our GtkBuilder instance +static GObject *get_object(gchararray id) { + return gtk_builder_get_object(builder, id); +} + +// Returns a `GApplication`s `GMenuModel` by ID +// GApplication menus are loaded from `gtk/menus.ui`, `gtk/menus-traditional.ui` and `gtk/menus-common.ui`. +static GMenuModel *get_menu_model(GApplication *app, const char *id) { + GMenu *menu; + + menu = gtk_application_get_menu_by_id(GTK_APPLICATION(app), id); + + return menu ? G_MENU_MODEL(g_object_ref_sink(menu)) : NULL; +} + +// app.quit GAction +// Exits the application +static void activate_quit(GSimpleAction *action, GVariant *parameter, gpointer user_data) { + g_application_quit(G_APPLICATION(user_data)); +} + +// app.about GAction +// Opens the about dialog +static void activate_about(GSimpleAction *action, GVariant *parameter, gpointer user_data) { + GObject *dialog = get_object("about_dialog"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(GTK_WIDGET(dialog)); +} + +// List of GActions for the `app` prefix +static GActionEntry app_entries[] = { + { "quit", activate_quit, NULL, NULL, NULL }, + { "about", activate_about, NULL, NULL, NULL }, +}; + +G_MODULE_EXPORT void on_show_window(GtkWidget *w, gpointer window) { + gtk_widget_show_all(GTK_WIDGET(window)); +} + +G_MODULE_EXPORT void on_boot_rom_location_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + + g_print("Active: %s", gtk_combo_box_get_active_id(box)); +} + +// This functions gets called immediately after registration of the GApplication +static void startup(GApplication *app, gpointer user_data_gptr) { + // UserData *user_data = user_data_gptr; + + builder = gtk_builder_new_from_resource(RESOURCE_PREFIX "ui/window.ui"); + gtk_builder_connect_signals(builder, NULL); + + g_action_map_add_action_entries(G_ACTION_MAP(app), app_entries, G_N_ELEMENTS(app_entries), app); + + GtkWindow *preferences = GTK_WINDOW(get_object("preferences")); + set_combo_box_row_separator_func(GTK_CONTAINER(preferences)); + + GtkWindow *vram_viewer = GTK_WINDOW(get_object("vram_viewer")); + set_combo_box_row_separator_func(GTK_CONTAINER(vram_viewer)); + + // Handle the whole menubar situation … + if (show_menubar()) { + // Use a standard window as main window + main_window = GTK_WINDOW(get_object("main_no_titlebar")); + gtk_widget_destroy(GTK_WIDGET(get_object("main_with_titlebar"))); + + // Hide hamburger button + GtkMenuButton *hamburger_button = GTK_MENU_BUTTON(get_object("hamburger_button")); + gtk_widget_hide(GTK_WIDGET(hamburger_button)); + gtk_widget_set_no_show_all(GTK_WIDGET(hamburger_button), TRUE); + + GMenuModel *menubar = get_menu_model(app, "menubar"); + gtk_application_set_menubar(GTK_APPLICATION(app), menubar); + } + else { + // Use a window with a custom title bar + main_window = GTK_WINDOW(get_object("main_with_titlebar")); + gtk_widget_destroy(GTK_WIDGET(get_object("main_no_titlebar"))); + + // Disable menubar + gtk_application_set_menubar(GTK_APPLICATION(app), NULL); + + // Hook menubar up to the hamburger button + GtkMenuButton *hamburger_button = GTK_MENU_BUTTON(get_object("hamburger_button")); + GMenuModel *hamburger_menu = get_menu_model(app, "menubar"); + gtk_menu_button_set_menu_model(hamburger_button, hamburger_menu); + } + + gtk_window_set_title(main_window, "SameBoy v" xstr(VERSION)); + + // Define a set of window icons + GList *icon_list = NULL; + static char* icons[] = { + RESOURCE_PREFIX "logo_256.png", + RESOURCE_PREFIX "logo_128.png", + RESOURCE_PREFIX "logo_64.png", + RESOURCE_PREFIX "logo_48.png", + RESOURCE_PREFIX "logo_32.png", + RESOURCE_PREFIX "logo_16.png" + }; + + // Create list of GdkPixbufs + for (int i = 0; i < (sizeof(icons) / sizeof(const char*)); ++i) { + GdkPixbuf *icon = gdk_pixbuf_new_from_resource(icons[i], NULL); + if (!icon) continue; + + icon_list = g_list_prepend(icon_list, icon); + } + + // Let GTK choose the proper icon + gtk_window_set_icon_list(main_window, icon_list); + + // Add missing information to the about dialog + GtkAboutDialog *about_dialog = GTK_ABOUT_DIALOG(get_object("about_dialog")); + gtk_about_dialog_set_logo(about_dialog, g_list_nth_data(icon_list, 3)); // reuse the 64x64 icon + gtk_about_dialog_set_version(about_dialog, "v" xstr(VERSION)); + g_list_free(icon_list); + + GList *children = gtk_container_get_children(GTK_CONTAINER(main_window)); + gl_area = GTK_GL_AREA(g_list_first(children)); + g_list_free(children); +} + +// This function gets called when the GApplication gets activated, i.e. it is ready to show widgets. +static void activate(GApplication *app, gpointer user_data_gptr) { + UserData *user_data = user_data_gptr; + + if (user_data->fullscreen) { + gtk_window_fullscreen(main_window); + } + + g_signal_connect(main_window, "destroy", G_CALLBACK(gtk_main_quit), NULL); + gtk_application_add_window(GTK_APPLICATION(app), main_window); + gtk_widget_show_all(GTK_WIDGET(main_window)); +} + +// This function gets called when there are files to open. +// Note: When `open` gets called `activate` won’t fire unless we call it ourselves. +static void open(GApplication *app, GFile **files, gint n_files, const gchar *hint, gpointer user_data_gptr) { + UserData *user_data = user_data_gptr; + + if (n_files > 1) { + g_printerr("More than one file specified\n"); + g_application_quit(app); + return; + } + + user_data->file = files[0]; + + // We have handled the files, now activate the application + activate(app, user_data_gptr); +} + +// This function gets called after the parsing of the commandline options has occurred. +static gint handle_local_options(GApplication *app, GVariantDict *options, gpointer user_data_gptr) { + UserData *user_data = user_data_gptr; + guint32 count; + + if (g_variant_dict_lookup(options, "version", "b", &count)) { + g_print("SameBoy v" xstr(VERSION) "\n"); + return EXIT_SUCCESS; + } + + if (g_variant_dict_lookup(options, "fullscreen", "b", &count)) { + user_data->fullscreen = true; + } + + return -1; +} + +int main (int argc, char *argv[]) { + // Create our GApplication and tell GTK that we are able to handle files + GtkApplication *app = gtk_application_new(APP_ID, G_APPLICATION_HANDLES_OPEN); + + UserData user_data = { NULL }; + + // Define our command line parameters + GOptionEntry entries[] = { + { "version", 'v', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL, "Show the application version", NULL }, + { "fullscreen", 'f', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, NULL, "Start in fullscreen mode", NULL }, + { NULL } + }; + // Setup our command line information + g_application_add_main_option_entries(G_APPLICATION(app), entries); + g_application_set_option_context_parameter_string(G_APPLICATION(app), "[FILE…]"); + g_application_set_option_context_summary(G_APPLICATION(app), "SameBoy is an open source Game Boy (DMG) and Game Boy Color (CGB) emulator."); + + // Add signal handlers + g_signal_connect(app, "handle-local-options", G_CALLBACK(handle_local_options), &user_data); + g_signal_connect(app, "startup", G_CALLBACK(startup), &user_data); + g_signal_connect(app, "activate", G_CALLBACK(activate), &user_data); + g_signal_connect(app, "open", G_CALLBACK(open), &user_data); + + // Start our GApplication main loop + int status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + + return status; +} diff --git a/gtk3/resources/gtk/menus-common.ui b/gtk3/resources/gtk/menus-common.ui new file mode 100644 index 0000000..07c5b3b --- /dev/null +++ b/gtk3/resources/gtk/menus-common.ui @@ -0,0 +1,422 @@ + + + + + + +
+ + _SameBoy +
+ sameboy-section-0 + + About SameBoy + app.about + + + Preferences + app.preferences + +
+ +
+ sameboy-section-1 + + Hide SameBoy + app.hide_app + + + Hide Others + app.hide_others + + + Show All + app.show_all + + + Quit SameBoy + app.quit + +
+
+ + + _File +
+ file-section-0 + + _Open + win.open + + + Open _Recent +
+ recent-files-section +
+
+
+ +
+ file-section-1 + + Close + win.close + +
+
+ + + _Edit +
+ edit-section-0 + + Undo + win.undo + + + Redo + win.redo + +
+ +
+ edit-section-1 + + Cut + win.cut + + + Copy + win.copy + + + Paste + win.paste + + + Delete + win.delete + + + Select All + win.select_all + +
+ +
+ + Find +
+ find-section-0 + + Find… + win.find + + + Find Next + win.find_next + + + Find Previous + win.find_previous + + + Use Selection for Find + win.find_selection + + + Jump to Selection + win.jump_selection + +
+
+
+
+ + + E_mulation +
+ emulation-section-0 + + Reset + win.reset + + + Pause + win.pause + +
+ +
+ emulation-section-1 + + Save State + + Slot 1 + 0 + win.save_state + + + Slot 2 + 1 + win.save_state + + + Slot 3 + 2 + win.save_state + + + Slot 4 + 3 + win.save_state + + + Slot 5 + 4 + win.save_state + + + Slot 6 + 5 + win.save_state + + + Slot 7 + 6 + win.save_state + + + Slot 8 + 7 + win.save_state + + + Slot 9 + 8 + win.save_state + + + Slot 10 + 9 + win.save_state + + + + + Save State + + Slot 1 + 0 + win.load_state + + + Slot 2 + 1 + win.load_state + + + Slot 3 + 2 + win.load_state + + + Slot 4 + 3 + win.load_state + + + Slot 5 + 4 + win.load_state + + + Slot 6 + 5 + win.load_state + + + Slot 7 + 6 + win.load_state + + + Slot 8 + 7 + win.load_state + + + Slot 9 + 8 + win.load_state + + + Slot 10 + 9 + win.load_state + + +
+ +
+ emulation-section-2 + + Game Boy + win.change_model + DMG + + + Super Game Boy + win.change_model + SGB + + + Game Boy Color + win.change_model + CGB + + + Game Boy Advance + win.change_model + AGB + +
+ +
+ emulation-section-3 + + Mute Sound + win.toggle_mute + +
+ +
+ emulation-section-4 + + Blend Frames + win.toggle_blend_frames + +
+
+ + + _Connectivity +
+ connectivity-section-0 + + None + win.change_serial_device + none + + + Game Boy Printer + win.change_serial_device + gb_printer + +
+
+ + + _Developer +
+ developer-section-0 + + Developer Mode + win.toggle_developer_mode + +
+ +
+ developer-section-1 + + Show Console + win.show_console + + + Clear Console + win.clear_console + +
+ +
+ developer-section-2 + + Break Debugger + win.break_debugger + +
+ +
+ developer-section-3 + + Show Memory Viewer + win.open_memory_viewer + + + Show VRAM Viewer + win.open_vram_viewer + +
+
+ + + _Window +
+ window-section-0 + + Minimize + win.minimize + + + Zoom + win.zoom + +
+ +
+ window-section-1 + + Bring All to Front + win.bring_to_front + +
+
+ + + _Help +
+ help-section-0 + + SameBoy Help + win.help + +
+
+
+
+
diff --git a/gtk3/resources/gtk/menus-traditional.ui b/gtk3/resources/gtk/menus-traditional.ui new file mode 100644 index 0000000..aa51dd7 --- /dev/null +++ b/gtk3/resources/gtk/menus-traditional.ui @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/gtk3/resources/gtk/menus.ui b/gtk3/resources/gtk/menus.ui new file mode 100644 index 0000000..aa51dd7 --- /dev/null +++ b/gtk3/resources/gtk/menus.ui @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/gtk3/resources/pixmaps/CPU.png b/gtk3/resources/pixmaps/CPU.png new file mode 100644 index 0000000000000000000000000000000000000000..7f13621351f0de516706036db2704d63de8e7abd GIT binary patch literal 18330 zcmeI4dvw%P8o*||P(VBz2ehy@O)`(n!|7<-X>C`At)s$+rx)IT%Bo-ImP`o`QO{^hHxz7xgG-i&-6g5vIw zzBfR%b%P-&6=QSqggnP+3&pt;Nt!ES5-Z$ZQ5%A+4^?});wg3wN_X}2X00n;R<)DhqqKDY5aaI;%})L z)xdrgp(II@ECqz~99eKG=VM?)B7so2&IB9HiMYXR(&`gnErt^)W=3&6g5eg-Y{782 z>!Y#7iodKr+G)wQr+0-D|4Y&o3xd~zqUGh~iRHRP&gVjLv)PPdT2!k=L=A+m^ax}H z;^Bt}oB%&|hNpb2S7130EcqpixH2J0qmcpyKV9Q;dxL>Id>1>BB3eOuQ9KbtBN=&% zIf3Jgxn4|zmwREjt`;w5Ro%nPpN;8K-rLf!Gl8bi7nTWZ!gIQ5YfI1M&pTCE<=k@q^J7V34-W4JqM z3<})&)xzCbQE87UWxJ0v(As_Y^6o{XChL}+qspYsAlXAPyf}5Q6Ru61z={`%w~*4^hUy|#q|tsFa#4V%VYQurNPJ$%a1|v z0Ml8t!2?XD)w`4KJQbbMN)i$3B~?s%TnueP!6XI^;eGmF&Yhky8}vnt9-(OyhUhWU zjF6;O+#+e(sMqQ+r^&>C@%`-F$%_v)cfl=?^GsrV*Ru(VwT)P%2vT9>^l@&O^m#ia-nP*QOL5{jgXOA#iZq~Zc36iF4AB1}L@#RW(xk}57mn1GUs z3y@GGRa}ZN0VNd|AfZUAxD;UmN-8cuLXlK)DZ&JlR9t|BBB|n1gb66AxBv-7QpKeR z6Hrod0TPO&ic1kDprqmgBos*%mm*9+NyP<7D3U5JMVNq+iVKiXBvo9BFaaeM7a*ZX zs<;$k0!k__KthpJaVf$ClvG@Rgd(ZpQiKU8ski_MMe>@sVneUNU_9cxFUrN2T+C_K zYs431z*I)I1A?mVgP`Z0hoB#>it;1`m0=L{O(6tX7DCWn+}!ay(;=wOu}ph%PQ{@Q z7pyBu7&ox#59LH$>@%%z4X7LSp=OMIT>*Z4@tD~ypK5Xsy;(DLVD1Y7v3=#({Kn23 z7T-T@t^0^$8GLqQ`;kF+r)lQoXVyJ)w(-vOIxhap7OVI96+^y0i+$B_qWZ*Qe%{3; zS9Jt5FMDR{)s6+JQ!Z4^sY`yg{n<~qoqvCX_raPWS2s;7(A~hzcO6N5;>HhZ`7@ty zr;azih9ICT~s6>dEY~=qsHa_a-lXt){W6W97M;6)m3in>KAC zZr^K8MA6%BtEs;5<*mPIy!g+dE@V&|bHSd?mN%4eO0t--lD<-rA;yE(d$;; zeEQ6pIm<`I$Hy11S~U88Xhdepux3cu((>xL0VTL*@Nhobjx}lCt$ldKXZP;WersJb zxx*Uo`0U{7=ceymIM@DE6qT^Mvi_rNF3OaYbiBQN_DNxPAy#M_=BuiD=|F8u%Ts@8 zXgGHtl{SEC*EPCxhGf|`Hbk?v1oUn~ANUh~)~s3k3J!j`X-#zhsG{iO1=ADGPI;#( zfBu~1Z0hvGhYx=^@yS=>cFeBXdh51byLR1^qPYdX^C5Km(g82yAJr#z+}4b@corNz zN~JG*EOq*4C+B$@_7q~TA3U}HPjgTFkkUT);Thuw@|uB*%07sSdTby*bSAWM(LQ=<614KaPrt&RKL?B$~_U%qUA%)aDA|9f-YZ*O@2=v@UR z+p%M9ZEf>o?kS3nzcOg@(vdOMSq)9q3Ag9fE`RjK1n^7ch9#2~Q^ zpZ4`U-?HMue%tHqO~#oSFC$3hwEi!WUu59k6ZMlue^_Pa`8rEE?9GEux{yW-CPVJ)4 zpK7aWj)%tAoK0o_eQslyz)lokspW7`|X;h!5)vNctb(SeTA!b4&L#- zp|jEe>}6`lPqQR%05ooOtLyY$`B@=Lj^D)IBT zEZKUj{4LzU2ifHq&4OlQ<;91tT8m_&na%Yjl^An91u zSt^h(0wgV$3|$N)V@1=Q)nx*jZ3}e6_ekyEf|(;n7G1XxX}Ccua_O1hk`S9C^=_N!#sLbV zQ6|S?7c1~f$TJn>oDRezvP|b)lFQw&XPuRNcbtl;I8$!9!NItIyIU3;(G(@0thaoS ztSJ3yozVkFwrt8iHN)ZihHS~LM>l64df+~y8!T3F;B#iteOpnCa`wLEu1}?;hwmUS zQdL(TcU8IImM@xDv*IEle|~wyCrZ&pwAP%X`zUSsegkE$+hmR&at?Ri_bM{)=99J* zzqB&vGQQVB1A^&CpWSk9dow5#iX`z@O1Xri?>uX@Zb!F&XgxG2Cp>q*z^#~8L!mVa z5|@PPg`|bcg)PJV4aLc^n2idHN+LHKi@Pbrna4{+N0vt(it3K6sFH8@Sd?(q`qJ8Y z$BvmHAMUhU-m|brHTT3ws=CQ$`IE74?#59`K}tdRF~rp)p$Bx0WixZ^8Wd&Y9XBoo zmt>_rG`(sXWE^CjWha(f`1pkbUrE?jE4_^s7ArIMoX&lqO51b!s=Bt1WI^Int8(iQ z>vNARd)|&vuf^Pm+F@O3u-9-hzsly4ZM)*fgw4vElr>a7DOcF8Q8}sjRk3+Xlf9Zf zsW8-NtVG1A+M(JyBJYx6mR)E3##8rll#QNPY1nCO*p=BU|3u|H`f=pW?45i&LrV-x z_;)UQEU;YaPGnncEA}a70Zt8fFllb~^5b_J+!8UrVak(N_3rFF+WWEB{ISZD=A2P4 z*A>|-WW-L_xF4ac2++7;^(d_ikMenWkapxz@VVU&Qww_vlCz!iUz`ovFr2s4T*W}e z*(+~z^izsYYH8MI@BZqSA(zoRE7O}&2S{m}6@lXyd&Jo`E6vk9(?FsiyYPKXZ*Px4 z&*5DGJv;92E;x6(yWm9DmF*w$-(DaYwb;94RBoS4{lh$wSbu0WHKCa3v`T;|a7%!B zU_#)H0Og?jLBE4}VkbrAq-|rKoAj8xIzo&wiTQNo&XM6G(lK&Lv6j!*B(Kr2yk_u`k?)m@Di9m#e0D@}bVV|Sj` zZT1Yg|M_%U%J#@NJIe{>0iP2;>wew%_01;aW)B7b!nW^7UwvWV7MEuUh3B?cmT8yQy*_$%qSLoOy?@W$ ziE7niCtC4>rWGTYk=Ee8(SM9mgR%n$hWkcwgYChaLi9cnhPpzY1?rDp9IPAC?i;Ro z_H;{o$iva&r%tvoEB*I2=-;h;Ua4b%La1dRTg@`at|qQVt){W|_b+99b`52C4nA!q z9aTG2o7)`|UKXw@-Xoe7Q4_v7oFrB(dOW-&BC}1t?bU6$^-0E&$gN2EW0F@;fP<^RJ)W4>3P@)*oWz$gW*z&ybqIgF`$2-53AMbr+b-eG;U;Slm z{F;%qO%~hI15su=X0eY`EG&*%7n;eYNn$)|Q%_&DVnuhoP4gho>#nN|mvqnXKIN2g zJ*>PnP=vHvzSHKOrmw=46rGfNW(6BpwvB!CAKLM;V(it}9hxjHi`M)|@1gl47iu8Y zyI!hkh*?ltc1rK6z-e&004U%xx?gUh~r)9nu~KJ*0J?w#JBvH#kp_)RbJ_Bi{L zUt@ndq#^9}Qe@Zs`67bP1PXi`KO>ap_p+kv!5u4%srL?O*zrXsGexKuo zj*ZEb7jM(z(}vO}I?0^{`nvQ{1Y)I>iTVD=r*Du~%SoEM!DR*p#%K84H=)(8;0l7u`XIY*s z{+9^46iIhHtgL-eD{Y;WnnSG9a(W%3 zj`oqI)p_^OEqC^7FJYd~Y^>;iS460MnoiK#9%M4n&{Z5?9N|&h+?girv+PPG>6G7| z3zT)WcjiYe^9^Vk=(`~m{BbDjrunjKq1T$We=Z9hKm01ee#?t3&V|}8UN;8V6YuC& zm1%wc1HL!fn3I*kD))_kDIpNz3*K2>SKU( zi&sU_MC+H+6!o1Wb+xI#QBED!_u5_f_4XeRKWVhRAHG=K64`RE(m9m=Rbss3L15FD zvLuzZIRGF4cm@-1mTv`u7Xck>fc3O9l9O*b<8n7owgjHh4C;-Yipx1I5ZB2f;3R9AYV2)5ar8SHRA;KV+^t=Od5kt zqx&MJ{F2@1yV!b2(_N!d z(4aTy1NyRAkR5hbI|!+z<#*FroAdFR)sn?t?+;zUHzKoIvK)dKAleRO(RVQ^;Cg?k zC#z=bJd14y{(#GcD@c7-M-2G1G<(0kSN{?to96zDj!f13(hLlw{laXjX2xtfre=m( z7otuyVuEBgo#{ZQdy{6u^~YHcI_g2;sfkduBvWXu@#-oV91(-za5AI$lMhR18d1q?@@!rRL>!jW%b#?A_Cu%A+=ICC z@;a+~z8<>hAB7y6)A36*^JTHgz7){Rm;@E5(P&hnmIj52 zRR=LBDpmuFQpXT9P;MBiCdv(uRi}UitTqnBP2;e%q58d~ZUJQnYU!eg{3C@fZ!g3_Ym@hFf$reY}?SPdmlK3{e7MLzKl)TOs@_^GG%JPBT=S89i-}_ z|5W;;Ti-3enbH0_oZKOp@y}uY>ox*BLEpcdC^N36wSMh{MR#WhkeT2*4=6&oo5eGJ z|7`ek1G?y`EyA1j9~cT2+5g`g2nCcj{a24VKsF= znL%j}oykEGK|=!%<&r-a|7>AH3k1C#jcHJ3%$myZ@K8(BHa}O)YUuPULyn4XhBK3s z&Yl81{cOt2CU7fgaH$-~7JCRmAw3nsyp z7g^=idSVbVmRf zfPQ=m1N|zMc($}9r3V1!gqj(za|nFdccR%mew|dUKK{ddwRvL{)UHg#D^nc@_D45c zgu9}#@rg4O1$K{|sm@tLcK^cdLl18iZarlBk41~qMB+rY9lr;HwjobS-;Abp_qg5@ ziQC0k^<1zEgBNXSZWxCClDfLOd<^()!~)}MWflS~(*66-pKHlRSKHMjUCPN*u6FZN zKH2F1ML!_@d{I&DR&%L?IlYNO(v+O@=M9bTQgKQdF9mfa z#aJeL^=`aK8A$gvo_n)6i`{w24ppyTDq=7%V@@mG>Dqb;i7IX5d29EVJtMJ0P%=WMEux+A$^Qlf3#)RY>ZGU4`tq?c*KLW;s0SgZ^BT{boOe2M;aonI`ugiBO^-tM zMkMw|8u`^8*m0^zzOP{4M7dahL86{;{fYIRZ_8Glv^QBBo;Y`#ZjYbO^SJb-O;QhXb)%P_;~k*(Ra)6OB=1(v1X%sv`{UC*a*KA+F+pWuN!aAv)>HZ$^_o?r z4RW6bud!HjTy%lhqTgz-I9#_;jI~&koRacV2&1E8zUH{nt7rKmb5kQ1uD5;hx;54L z>vC;5p`o$gLl>`)Vw&ugIyh|5%FpUykC$TIU6vPR<@DBOXJ=oP;|D~REKg3;{3avQo4WA0;23?U)6M92|iE=_)tzVm+Xdf#t-Yt5`R{$ua|Wk0|D-+TX`nKiS|&Sw2Q zsijf?0L-&6H?;>PZ2T!H0siF$1-%Ew9FDmQ4*(Xe7=Mac*e~w~0I7V2iHV(^H=EDq zd9yh%3lkFpwkfnE&V$mm+k5!f-Y<<)8%B;>A3lRXrw z=bVk&zyECOQo99Wa-}mja^{6)i7mK!NkajNs5x~i=YW{p>bK%`7v4IS%jEWqo-h66 zbmoo0aMK&a>@fdhT8rjx{3T53u+>84mvxp_mh=TDX3Xd@5~HPZ0`2o`9UK&Zt1myR z?gm0G&y@tO!hLd_wfBrM9Yz@TD!{^7KxT+0Vm6>B7N*p>Zv`5NmI2HT&^(s_g(^To z?2Xe@AWI5JSRxl94?2l+l?;lH1 zIvMg#+5||YS%#;Hh0P3mL_;*FZDa!FC{ z!qom+`)KQ~Xt_1Du@U#Bb{=7!sxLNXYER|sIQB*PI&q2+K?N|H(aC` zpK180$=|2H<*=UH!n4JcL;Tf>zpe2*s*S-5R-2qsmodC!Xms*GyZq~$X!nRS&I-7A zcZJjU(o0bL%h48D#&_HInp%&TYF?3%geetYJ(3PTECzgp%Om0?(P)~sYMygKReO{G zk8%D`=ffr8LClE*Z&0UscMgR7t8-zN`iq!xnm~&3Pp*gI1fp{DQ(e@-Omh=lJeY zwi63(10Gc_AV|PDOY5(%D3;J|o3FoTheEg$a)v5ddabOw@p^@*MW=pCfNhR4xMrq* z7+5a7&nz}Ze!2JpHSTg%m)&u&bn{vHs+sF|thG_=I;>?b!&O~kwD)j8jg!0yLqqQI zI_vw#G!%!{n%sBht0eByF&?~U%$M78XmeWRefoR-pn2uHKcwZ}+bE4(ov~|)M}vam z;C1ypsgLmgeEJ=9WbaQF8MTgc*l+QQES$zbW?kRq0Tq>mJu#&!f&? zecYC~J-OJmSgc9%&FqvzPbyv8n){VP)JftM3hsLl*Ppc7wjM)9vSF<~(Y25Gx4VVq;)gZl#>M<7DQ2ZN`pEC0ISCT=vlh zn=;#A+cOWXyI;JgmPTLMx7D`7Xs7X5)(yM-jqMr(@tapWuEuE%tuEiVQtPKz!TcM-odEu1B?1x1t)5^U*r!y$LfjmK?c$+w&;$H)PqdWj)(^4)qN5Y|+@&S&gRy*AJdw zv_Z>A%hl)n<^v5BW>R7L2j9M%&w?)@wpFCmC%qvh>y`^X<#o&O?UXkpdneO~v-vr% zqkDR~CA#vnY3(jPpxnpOZu|mD6uYb1vUO6(Pfzg zQKC|UyL(ikS%R{czIXfH^Ye~Nt151cerncj_WU3*+AMnL;Pr!p2Nk1L6Jo5Nt~|DK zjdiIN=~&{il?gc*CMuMi!KgyjVSJFmR2$u4v^#YxbI0>=kIKTD!l%sb4;L2j^KW0u zx^$Twu|>~yPL{vx(Cw>tImv2?8x7L#Cer&T$v({<1|Df-Ir_zC88=_uvFbQhiz%w_ zO&q!2P`lYX_}+(;$%$@J&D+ZGWdR?Ke$fAH`T6;Lexy-k{QT_sY~^gFhf2eQ7d%fw z#F}hg59iaH-gfQnEWV0A%HLvpCbye{Y24U*u(vKp;N<=!KIe>EMX_F4ZPTHW(N0!h zO5cu}(VN;AT^JYV*DrmKeBT<>JN(BmH84Z)X0Ue{-QOPM7;G?vfA=c*iNJ6;ufO)4 zUhiPllLn{u;0MD;P8@IHR`~C{ZCF$Bv|^1B9Hx`1-fEFb_Av7>X*G}8bT2>kgGUI* zyT758bVw(%IYjAR?_zt?l_W)pZG`QR-XN)nesJ z;P1A_xjZ^`*4;~vzWz>5(x~<`9im~W*4_mdVXy3NS39>ny^|-?al7N?cIAOv1H6vc z9fm7Du8LdvepS8IuPFk!#Ttv4M~PNehir2!RFdV8Ue!q_OKf-tUcE^6!n12HYYi53 z&Fwnjl6pC;tW_XITA|iycT1PGyeM%^;w_78OXaqa0snVf2g*mDk6dS{Fwz-!9~wN^ z@X(zqp!(J+)W5%_T^9oHmvfMOL7(N-cjr@_@-esL20B)<_|6!vJ=bR6Bh$uH^$|gH zf7k9^;JWX?jnM;5i~5|g>T}{BnJ?(pXPl4Ll&j0ByVL2@DPEFN5?^v+aW#T;#nf+~ zckNL6(G9xVp(%?Kh6mA2=ok5iLU#Y@I3ivbdi1UPt}Ju6`*{z%X>GSohNp&?I>tFR zp5NihEGy*?MdIf8Jd^U9J6CG<6Nzl5hW+YT`Jrr{dr^P^tK1`WSR!&>8U9a=SBu@@ zd2mgwk;21813k9>hVf(AE1IF3hUr~*f(vB}qY9gvdkPA2915_xe2(kK!dHD+eK(&Q z_BvnauslX-e32ZN{4RO4liZnI79GHB9LiR|*lv@~rfrJ1dA#?WZP`d!@UY-5qv?EE z5%ukp(D2aV53~E&IrwayHAaM(;MT^4!{XAA(t5WK#UY>eKabz!)ac}zqv!5(q;9pZ7AdQox&6s1Fzunpt~*aD*U?fT^|b8EC>jCQ`KDlM7Jn+Ol9oF zfzQ`IvsGV`6oQ@mCCAQw%)8Z*zlvykZfDWQ^30Z!vD;x|SBK7^Y*pvKlW-qZ8|`>* z*M|9YF~956-Pi6&KH6?6&u{)k(imPV6`I3C;O@?aPB9T-)oxyqhgiEw?IML)f1eeCoI_ zsQ*};pw%`503-nKAmY`sEkMvhpkpPlj&VwEthw`W=H{^$!6{vFAPi%~Tw|mJ>{$f# ziUXT~R57DCU85}B)cN!GcfCEFvF53*V52M0PwVJ-D+fd^0$M&-RabARs;+nfc*p?H z3~l(^0U%t;XxXbzS*KdfZWP`a>%B2H!#+$bE$Xt%C;%A7GaQ`x&em2$3Y)1zrm{V0 zIszsKtaSlE-%!9IQ+#NAm?zDP!7@;PTUMbCV^9s$op9DjYmN!cn_(WrrELnbai9eG zQ1qzkh9oI{0TFb-r18lx0n?YoBMJ=EC;Sq@*W=9yb=ZUo-^W0G?RY?#v$Y+}gw3VF za5{K61%)BNboF#lI6VRys|`aVQFsJW4}rqMktiZkkBCIUzCP4RQs66nE|pHSH#Pej z4*btR-J8$n5D|!gfB>BUj1HUYg+S@)=^>D41R4zoHQ>BJ7N0DDvv|uUoj`s}X*>#- z!QnI5EZDeTvM1Y*Z=kL|9_ZWS>vb_X-vY6CU)g~a5dty?fzm-DrZb{azS(g6xV{rZ zqf!twUmBCf;`2Z|)Um>`8#5sVFP~i9wU86#4`XYwM}ze{*fhrudC7A<*^YZbM~L zK=G!XOKL*f8j2{ucjQ_w?@W}rE-b7IFXfPRRNVpyii-cn_x_G#!rydTj>xsj9(vZ4X zoF@jF=>PRZOx5>m{)^X2rEwYmN~TU3Q|7X|y zZ?8?^&b-NK6|GI^)S29E|9bL4r|I8M%JEtYEE!BE^V4j6RgG`f|NLMC&o;1ZB~IZE zl`6t+sXv(iWi@{F4i+a+weqhO50itNVm_UB_P<-AOh%c;&G%>!`6+;>9E1Ab_9~(Y z+n3F?W>aY-@VuF>d5X{P-QcGvc9S2XkW3jojxRZIs_~TGDc0kqKM|~}z%zbg>m;G{ z5r1p@QQvvIKJxXOsDDscEE0SmP~(5U+D`5N(bnak*iP;L(e}HkBa6W&p}&Uvp?Qkc z_#Mh5%uV23IgNzJ;V?LT#E;ECTG%lJG+$>^23Q;O#%nwb7-_=h$Bt?w)E{KFs zQiMw=OpuZY7eqoRDZ(WbCP+zy3nC$u6yXvI6Qm@<1(6U+if{>q2~rZ_f=CD@MYx2* z1SyGdK_rBdB3wdYf|NwKAQD1J5iX%HK}sTA5DB5A2$xWpASDqlh=fp5gi9z)kdg=& zL_#Pj!X*?YNJ)eXA|aF%;SvfHq$I)xkq}CXa0!J8QWD{UNC+iGxP-z4DT#1FB!rS8 zTtZ=jltj275<*E4E}<|%N+Mhk38AD2mr$4>B@r%&giun1ODIf`k_Z<>LMSQ1B@`w| zNrVd`A(Z@wxTL;+*Pg}#zhEB#ev`gG6XyYb3m--?x3>lW)++EPp=eF%1_1FD7N%<*1kWxz)v`JWvZ1HX-aIhFy#8e0ak1eQzw>um z?R42$6>{4ur~Bm}%VlE;F_{ta>*`m?%Wv394iMYBD6Yoorc>@MD(OUrk)rs=4}r}z zrK@#aez_EsR^{U zwTW58wuWgZ&jf&&<@=gv`nib%O4XH_RW_sd6n39GmniMK=4hyy?X1+ep7Jp*pr@4e zfPDh4`ekXD+maHE*^+7rcj(IPkNpl76&2OZNR7Luu=~lAC&{Gh83c#6MRE2YugIvG z=I(y``RLpO;vZfCTWdl{?!B7`#*(Mw%pb}-Ix?+?sOVjMKZ+4v3 zGQ5V`k#t?*VNy}(ddW&|$qjCa@1GH}9Jc^1-KY47=bN9Ce?x0RsX-?kO+)4!#`E_=d;HCLRh7Tw(5f|L}bQ{!fIDUlWMU7G1LyOb<7y|XvUue-Q*qkQ?xKjk&+fy+%TEn^vRLBTb0 zElo{-=KoX)$un=@mqe8I!hae^H?zRYQ@IACMi zm4Ae8tY&)VK1kp{WoNpZnrRjkjHV=u8%ypXKh=*U z7yFr)JRJ)^rLk1@^QY=Yz;|^9vz*B^^e2)ejMk&FFBiHNI~H#M2t->ugMOj6K5t2UP!^QUCw| literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/Speaker.png b/gtk3/resources/pixmaps/Speaker.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6b556a5a085459bff39898b411e4a5e177c89d GIT binary patch literal 18543 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 P0xk9n6dm$iz2ScV#@DwE literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/logo/logo_128.png b/gtk3/resources/pixmaps/logo/logo_128.png new file mode 100644 index 0000000000000000000000000000000000000000..182efdb6097d453a76e16f1c2f53ba7c2d134b41 GIT binary patch literal 6878 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 Y50EpU2~&=UR{#J207*qoM6N<$f^k1bPXGV_ literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/logo/logo_16.png b/gtk3/resources/pixmaps/logo/logo_16.png new file mode 100644 index 0000000000000000000000000000000000000000..29abb75d7b8868ba6acfed6c320dab06da36df18 GIT binary patch literal 974 zcmV;<12O!GP)EX>4Tx04R}tkv&MmKp2MKrixZ74t5Z6$WUFhAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRR6lU)_NUJ*is<|slkvy3@OO2T)1-6O#FyBN>%ulsZKsyT}R0g-r?8KzCVK|H-_ z8=UuvBdjQ^#OK6gCS8#Dk?V@bZ=4G*3p_Jorc?985n{2>#!4HrqNx#25l2-`r+gvf zvC4UivsSLM<~{if!#RCrnd`KMkia6AAVGwJDoQBBMvQiy6bmUjkNfxsUB5&wgf3p8qu^L^|%jT0dF3|#3gf29u0e3D*k zY0)E~ZyUI{ZfVLMaJd5vJQ=bnyHb#rkk13}XY@^3p#K)=S@ZhVJjdw+kfvTGZ-9eC zV5C6V>pt)9ZtvT_HO>D00Ax>cq52!~ssI2024YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jdA86fO{h@N>}s000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0004{Nkl#7PsX`s0B?D4u z)a$usvq=cyOtW*2Mx)`56N_02%ON=?W9K&J5fn&(%a<H~ wm_$V1zk9oPe2u57|Kpq$*aS9!cJV8}0bmfLKTUP=DgXcg07*qoM6N<$g5XW35C8xG literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/logo/logo_256.png b/gtk3/resources/pixmaps/logo/logo_256.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd67abd093da75de64dfeb498d75b4e0c6f7501 GIT binary patch literal 16022 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 literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/logo/logo_32.png b/gtk3/resources/pixmaps/logo/logo_32.png new file mode 100644 index 0000000000000000000000000000000000000000..798219388d5db78add0d7ef90873a9fdc9df5064 GIT binary patch literal 1434 zcmV;L1!ek)P)EX>4Tx04R}tkv&MmKp2MKrixZ74t5Z6$WUFhAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRR6lU)_NUJ*is<|slkvy3@OO2T)1-6O#FyBN>%ulsZKsyT}R0g-r?8KzCVK|H-_ z8=UuvBdjQ^#OK6gCS8#Dk?V@bZ=4G*3p_Jorc?985n{2>#!4HrqNx#25l2-`r+gvf zvC4UivsSLM<~{if!#RCrnd`KMkia6AAVGwJDoQBBMvQiy6bmUjkNfxsUB5&wgf3p8qu^L^|%jT0dF3|#3gf29u0e3D*k zY0)E~ZyUI{ZfVLMaJd5vJQ=bnyHb#rkk13}XY@^3p#K)=S@ZhVJjdw+kfvTGZ-9eC zV5C6V>pt)9ZtvT_HO>D00Ax>cq52!~ssI2024YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jdA86fOqm000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}000AVNkl4cXDQ9)0IWymPzkBAp=f;dNY>ikf2Ji}S6zHb8SOC5RPS?V+cX{#X zC!c-s(%`^gvKjP?moApye(Mc@)3u)OM8E>Ng)Ndd3I(**w*_ul7QzeKle~HIWZgQuk&kVFAAGzA%d+YcUOIQBVZwHlRk`i$2qAW@ky1ud zsxE;T&|A$NA+Q~XRz_U{`+&*$EC90%lZQJ?U~81t3Itw&R*KMd}X z$D-ulJm7|VTpql~*;^xeVf^kp?}SPz!cbzxENme*CZ?Ue!x*&Ibx+QQ2!v7+1U}i! z95d&C;mE|J45kn7NJ2`<+Q;7@m89dHNotK@5eOIzhRfLum$P$7DOq01VSx0Zp>1=3 z=T*>3Qwqz(0Fg-Gd0ul02-{}r>=|6wMM_C7mqTk!`rTUz$RMEj>Gy;>Wcb4q7;W%8 zk7Awevg%C(mKEpKW3MqXHjeN6JaS}$=U;qzTV=v=D62BkNQ?nL2sk&rj0{b4Mr4d( zXk?VWz6VfB(bdz#;i2K}QpV#9eQ<(>=bmP6K95q0$3{{JJJ$SZSgCmQ4?N6!?|-yo zQz@+}mCH;VIzU3KuPY%eO0BSB0By`B_=TBiF3e1C%QrxmmvWq+{+VL2(0U^RFzx*S zRJ~Jk7e&W)fe;{Q@LI_;9 zjd_j*Y|NK2CtCO8>*+5bY9AI>G497|EQ2zi@ z85S3>^3#t$Tm`<4s(=QrEi7KCtgf!OQ3>YPe#Q6waCY|hYg1>>WU9C0+D@~}_54`% odVb$+wn-WIt_q&r@RY6bA4H93BzFii@Bjb+07*qoM6N<$f(reX&Hw-a literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/logo/logo_48.png b/gtk3/resources/pixmaps/logo/logo_48.png new file mode 100644 index 0000000000000000000000000000000000000000..3d19b2d070a630236c779dc7638ed8b3a70102f7 GIT binary patch literal 2213 zcmV;W2wL}vP)EX>4Tx04R}tkv&MmKp2MKrixZ74t5Z6$WUFhAS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRR6lU)_NUJ*is<|slkvy3@OO2T)1-6O#FyBN>%ulsZKsyT}R0g-r?8KzCVK|H-_ z8=UuvBdjQ^#OK6gCS8#Dk?V@bZ=4G*3p_Jorc?985n{2>#!4HrqNx#25l2-`r+gvf zvC4UivsSLM<~{if!#RCrnd`KMkia6AAVGwJDoQBBMvQiy6bmUjkNfxsUB5&wgf3p8qu^L^|%jT0dF3|#3gf29u0e3D*k zY0)E~ZyUI{ZfVLMaJd5vJQ=bnyHb#rkk13}XY@^3p#K)=S@ZhVJjdw+kfvTGZ-9eC zV5C6V>pt)9ZtvT_HO>D00Ax>cq52!~ssI2024YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jdA86fHQNXo%_CX>@2HM@dakSAh-}000JjNklNNU$O9nKB&{hBOyVY~lkD2g z#%bdvw)Z+S=Q2Fljsk9KkF$$?q?J~)JLmkq^ShrJD~@9}GAzsTfDF(I2%0wxPyQ<~uKa|JB~UzO3UoSeDgr$>TUiDaFm%+3|0D{c9(HVj}@swN}}Ed-q`C znAn(x16V>JEQ{%UF1w;>8VMkxC}L*zCQ%p?MG?jrHfnC>kv6bcR3Ku=E(&pi8VqI*R0-J&VN!}7dIUCY^o!q=^@u{2!P|dxGnyAK{D~~HpK@3Tp*QL9IGjQvnha2mrJ}< zdY9DNOqA@?2<>m?rYFAlU8=boJbibOzfVk{R)yb!u_=I`{`?nIDir``W(#x=4sdgN zj&!DtSj9v#!f){j>LCC@H9$Bvna*}<TiBt5dJm zX-~INE!S~e8^6V;vQQkzG@}z+ z9m69dIF8d?C$?>S&9z&9y8h6@@87?lY&QFz^EVX0^E~?d`^n{U4YB!-&JKYR6 zW#ZB96m+Nf)NlrXY=8T`-|qjuEvnH~yEVoDF_tAB$|qKjW;PR|oy{z!wL-3(3#~5f zxE_wAeu-Ox@- zDG9@n=-d?YpEvOy>%)3#h!$To*NI~jIT*Gx;;%1sq9LHF~;+5b28pm-ccuG9od6Wm!13&E%zvIF5sD+Xx|8T3lq|?p>sm zJoo(AgMCLS%72?8R+`|A%k28hF?vsYoW9QM`e)f}>x%jUMdixGAcIwO2>%sflu;V!NoqUpmW1pl{4tRIILZ;nDYlCCMH^=&L z9gC%6Gc~ZXV^S%!)&xO-REj8)8*;!%Mg&2?Aqu4sN90MN!zuLqob zevIcnKSpd~l-3&x0#YiZRE+ee8R%`>+EOBp8prWUJ85lgPi(YiCVzuB z&Yf9vZT$Re|C7x%#u)xxoM&bx&&+gwQ%`#u3UKz!p9#Z=uw{f(KfVFL`Llmvp%hXG z2e`Wwp|wV9jZ%^;mnVs&L`IU?nd$rLt1SZ9cQDJhUi0|Tg%U5n@W}FRXCCFnzxoXJ zw$Yh(Fvf6uuE3k)>1XQd6*3*295`@*skg6kaNrQT_v|642WTai>-4PvSg)Uc?AS**fA$RBJ-uYo zX^O>pjz94vaSTBivbeNJd8t$cWWxbgp9^pHY)C1M?|U2?8p4WWT3S;KcXty6AxbI2 zFkmL1r*NzAdzN1}XefZG)v7EmE|5yKBE;q(q>Sk5>Oxootu+e^izub2l*>%#a})|U zue^Tl?2ACP(EzpFjT__B`FysKM=C3tHA<;Fl}h>a#DxprE*9r!Vfn$&x~0uFd0Qo3 nvH9wX>8Ry=7dH-IyN>?=^NkIG_;L1@00000NkvXXu0mjf-Bu<4 literal 0 HcmV?d00001 diff --git a/gtk3/resources/pixmaps/logo/logo_64.png b/gtk3/resources/pixmaps/logo/logo_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c5685f5a5c24d1204d8aa45207d02d9a2c1768 GIT binary patch literal 2838 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 literal 0 HcmV?d00001 diff --git a/gtk3/resources/ui/window.ui b/gtk3/resources/ui/window.ui new file mode 100644 index 0000000..4dc41ae --- /dev/null +++ b/gtk3/resources/ui/window.ui @@ -0,0 +1,1610 @@ + + + + + + + + + + + False + normal + SameBoy + Copyright © 2015-2019 Lior Halphon + https://sameboy.github.io + sameboy.github.io + Lior Halphon https://github.com/LIJI32 + +GTK3 frontend by +Maximilian Mader https://github.com/max-m + + mit-x11 + + + + + + False + vertical + 2 + + + False + end + + + False + False + 0 + + + + + + + + + + + + + + + + + + + + CPU_CGB_0 + CPU-CGB 0 + False + + + CPU_CGB_A + CPU-CGB A + False + + + CPU_CGB_B + CPU-CGB B + False + + + CPU_CGB_C + CPU-CGB C (Experimental) + True + + + CPU_CGB_D + CPU-CGB D + False + + + CPU_CGB_E + CPU-CGB E + True + + + + + False + 920 + 400 + + + + + + True + False + vertical + + + True + False + + + True + True + in + 600 + 376 + 600 + 376 + + + True + False + + + True + False + Placeholder + + + + + + + False + True + 0 + + + + + 320 + True + False + vertical + True + + + True + True + in + + + True + False + + + True + False + Placeholder + + + + + + + False + True + 0 + + + + + True + True + in + + + True + False + + + True + False + Placeholder + + + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + True + 0 + + + + + True + True + 3 + 3 + 3 + 3 + Console input + + + False + True + 1 + + + + + + + + + + + + + + + + + DMG_CPU_0 + DMG-CPU 0 + False + + + DMG_CPU_A + DMG-CPU A + False + + + DMG_CPU_B + DMG-CPU B + False + + + DMG_CPU_C + DMG-CPU C + True + + + + + False + Preferences + False + + + + + + True + True + + + True + False + 16 + 16 + 16 + 16 + vertical + + + True + False + Boot ROMs location: + + + False + True + 0 + + + + + True + False + 5 + 10 + 0 + auto + + Use Built-in Boot ROMs + <separator> + Other + + + + + False + True + 1 + + + + + True + False + Rewinding Duration: + + + False + True + 2 + + + + + True + False + 5 + 10 + 0 + 10 + + 10 Seconds + 30 Seconds + 1 Minute + 2 Minutes + 5 Minutes + 10 Minutes + + + + + False + True + 3 + + + + + True + False + 5 + + + False + True + 4 + + + + + True + False + Game Boy Revision: + + + False + True + 5 + + + + + True + False + 5 + 10 + dmg_models + 3 + 0 + + + + + 2 + 2 + 1 + + + + + False + True + 6 + + + + + True + False + Super Game Boy Model: + + + False + True + 7 + + + + + True + False + 5 + 10 + 0 + SGB1_NTSC + + Super Game Boy (NTSC) + Super Game Boy (PAL) + Super Game Boy 2 + + + + + False + True + 8 + + + + + True + False + Game Boy Color Revision: + + + False + True + 9 + + + + + True + False + 5 + 10 + cgb_models + 5 + 0 + + + + + 2 + 2 + 1 + + + + + False + True + 10 + + + + + + + True + False + vertical + + + True + False + 2 + /io/github/sameboy/CPU.png + 3 + + + False + True + 0 + + + + + True + False + Emulation + + + False + True + 1 + + + + + False + + + + + True + False + 16 + 16 + 16 + 16 + vertical + + + True + False + Graphics Filter: + + + False + True + 0 + + + + + True + False + 5 + 10 + 0 + nearest_neighbour + + Nearest Neighbor (Pixelated) + Bilinear (Blurry) + Smooth Bilinear (Less blurry) + LCD Display + CRT Display + Scale2x + Scale4x + Anti-aliased Scale2x + Anti-aliased Scale4x + HQ2x + OmniScale (Any factor) + OmniScale Legacy + Anti-aliased OmniScale Legacy + + + + + False + True + 1 + + + + + True + False + Color Correction: + + + False + True + 2 + + + + + True + False + 5 + 10 + 2 + emulate_hardware + + Disabled + Correct Color Curves + Emulate Hardware + Preserve Brightness + + + + + False + True + 3 + + + + + Keep Aspect Ratio + True + True + False + 5 + 10 + True + True + + + + False + True + 4 + + + + + 1 + + + + + True + False + vertical + + + True + False + 2 + /io/github/sameboy/Display.png + 3 + + + False + True + 0 + + + + + True + False + Video + + + False + True + 1 + + + + + 1 + False + + + + + True + False + 14 + 16 + 16 + 16 + vertical + + + True + False + High-pass Filter: + + + False + True + 0 + + + + + True + False + 5 + 10 + 0 + + Disabled (Keep DC Offset) + Accurate (Emulate Hardware) + Preserve Waveform + + + + + False + True + 1 + + + + + 2 + + + + + True + False + vertical + + + True + False + 2 + /io/github/sameboy/Speaker.png + 3 + + + False + True + 0 + + + + + True + False + Audio + + + False + True + 1 + + + + + 2 + False + + + + + True + False + 16 + 16 + 16 + 16 + vertical + + + True + False + 10 + + + True + False + Control settings for + + + False + True + 0 + + + + + True + False + 5 + 5 + 0 + 0 + + Player 1 + Player 2 + Player 3 + Player 4 + + + + + False + True + 1 + + + + + True + False + : + + + False + True + 2 + + + + + False + True + 0 + + + + + True + False + 90 + 90 + True + + + False + True + 1 + + + + + True + False + Joypad for multiplayer games: + + + False + True + 2 + + + + + True + False + 5 + 10 + 0 + none + + None + + + + + False + True + 3 + + + + + True + False + 5 + + + False + True + 4 + + + + + True + False + + + Configure Joypad + True + True + True + + + + False + True + 0 + + + + + Skip + True + False + True + True + + + + False + True + end + 1 + + + + + False + True + 5 + + + + + 3 + + + + + True + False + vertical + + + True + False + 2 + /io/github/sameboy/Joypad.png + 3 + + + False + True + 0 + + + + + True + False + Controls + + + False + True + 1 + + + + + 3 + False + + + + + + + True + False + SameBoy + 320 + 288 + + + + + + True + True + False + + + + + True + True + True + True + SameBoy + 320 + 288 + + + True + False + False + True + + + True + True + True + none + + + + + + end + + + + + + + True + True + False + + + + + False + Memory Viewer + + + + + + True + False + vertical + True + + + True + False + Placeholder + + + False + True + 0 + + + + + True + False + Placeholder + + + False + True + 1 + + + + + True + False + Placeholder + + + False + True + 2 + + + + + + + False + False + 320 + 432 + + + True + False + Printer + False + True + + + gtk-save + True + True + True + True + + + end + + + + + gtk-delete + True + True + True + True + + + end + 1 + + + + + + + True + True + in + + + + + + + + + + + + + + + + + + + + + + + + 148 + 2 + $7f + $87f0 + $fe20 + ---01 + + + + + False + VRAM Viewer + 512 + 384 + + + + + + True + False + 3 + 3 + 3 + vertical + 6 + + + True + False + center + vram_viewer_stack + + + False + True + 0 + + + + + True + False + False + False + slide-left-right + True + + + True + False + vertical + + + True + False + 6 + 6 + 3 + + + True + False + 0 + fgngfn + bg0 + + Background Palette 0 + Background Palette 1 + Background Palette 2 + Background Palette 3 + Background Palette 4 + Background Palette 5 + Background Palette 6 + Background Palette 7 + <separator> + Object Palette 0 + Object Palette 1 + Object Palette 2 + Object Palette 3 + Object Palette 4 + Object Palette 5 + Object Palette 6 + Object Palette 7 + + + + False + True + 0 + + + + + Grid + 70 + True + True + True + + + False + True + end + 2 + + + + + False + True + 0 + + + + + True + True + False + + + True + True + 1 + + + + + vram_viewer_tileset + Tileset + + + + + True + False + vertical + + + True + True + False + + + False + True + 0 + + + + + True + False + 6 + 6 + 3 + + + True + False + 0 + auto + + Effective Palettes + <separator> + Background Palette 0 + Background Palette 1 + Background Palette 2 + Background Palette 3 + Background Palette 4 + Background Palette 5 + Background Palette 6 + Background Palette 7 + <separator> + Object Palette 0 + Object Palette 1 + Object Palette 2 + Object Palette 3 + Object Palette 4 + Object Palette 5 + Object Palette 6 + Object Palette 7 + + + + False + True + 0 + + + + + True + False + 0 + auto + + Effective Tilemap + <separator> + Tilemap at $9800 + Tilemap at $9C00 + + + + False + True + 1 + + + + + Grid + True + True + True + 2 + + + False + True + end + 2 + + + + + Scrolling + True + True + True + 2 + 2 + + + False + True + end + 3 + + + + + True + False + 0 + auto + + Effective Tileset + <separator> + Tileset at $8800 + Tileset at $8000 + + + + False + True + 4 + + + + + False + True + 1 + + + + + vram_viewer_tilemap + Tilemap + 1 + + + + + True + True + sprite_list_store + False + True + False + horizontal + + + + + + 32 + + + + + + + + X + + + + 1 + + + + + + + Y + + + + 2 + + + + + + + Tile + + + + 3 + + + + + + + Tile Addr. + + + + 4 + + + + + + + OAM Addr. + + + + 4 + + + + + + + Attributes + + + + 5 + + + + + + + vram_viewer_sprites + Sprites + 2 + + + + + True + True + False + True + False + False + both + + + + + + Type + + + + 0 + + + + + + + Color 0 + + + + 1 + + + + + + + Color 1 + + + + 2 + + + + + + + Color 2 + + + + 3 + + + + + + + Color 3 + + + + 4 + + + + + + + vram_viewer_palettes + Palettes + 3 + + + + + True + True + 1 + + + + + True + False + 10 + 10 + 10 + 10 + 6 + 6 + vertical + 2 + + + False + True + 2 + + + + + + diff --git a/gtk3/sameboy.gresource.xml b/gtk3/sameboy.gresource.xml new file mode 100644 index 0000000..3afb84f --- /dev/null +++ b/gtk3/sameboy.gresource.xml @@ -0,0 +1,46 @@ + + + + ui/window.ui + gtk/menus.ui + gtk/menus-common.ui + gtk/menus-traditional.ui + + pixmaps/logo/logo_256.png + pixmaps/logo/logo_128.png + pixmaps/logo/logo_64.png + pixmaps/logo/logo_48.png + pixmaps/logo/logo_32.png + pixmaps/logo/logo_16.png + + + + gtk3/resources/bootroms/dmg_boot.bin + gtk3/resources/bootroms/cgb_boot.bin + gtk3/resources/bootroms/agb_boot.bin + gtk3/resources/bootroms/sgb_boot.bin + gtk3/resources/bootroms/sgb2_boot.bin + + + + gtk3/resources/Shaders/AAOmniScaleLegacy.fsh + gtk3/resources/Shaders/AAScale2x.fsh + gtk3/resources/Shaders/AAScale4x.fsh + gtk3/resources/Shaders/Bilinear.fsh + gtk3/resources/Shaders/CRT.fsh + gtk3/resources/Shaders/HQ2x.fsh + gtk3/resources/Shaders/LCD.fsh + gtk3/resources/Shaders/MasterShader.fsh + gtk3/resources/Shaders/NearestNeighbor.fsh + gtk3/resources/Shaders/OmniScale.fsh + gtk3/resources/Shaders/OmniScaleLegacy.fsh + gtk3/resources/Shaders/Scale2x.fsh + gtk3/resources/Shaders/Scale4x.fsh + gtk3/resources/Shaders/SmoothBilinear.fsh + + pixmaps/CPU.png + pixmaps/Display.png + pixmaps/Joypad.png + pixmaps/Speaker.png + + \ No newline at end of file