diff --git a/gtk3/main.c b/gtk3/main.c
index 106541d..7eeb7de 100644
--- a/gtk3/main.c
+++ b/gtk3/main.c
@@ -1569,6 +1569,13 @@ G_MODULE_EXPORT void on_display_border_changed(GtkWidget *w, gpointer user_data_
border_mode_changed = true;
}
+G_MODULE_EXPORT void on_monochrome_palette_changed(GtkWidget *w, gpointer user_data_gptr) {
+ GtkComboBox *box = GTK_COMBO_BOX(w);
+ config.monochrome_palette_id = (gchar *)gtk_combo_box_get_active_id(box);
+
+ GB_set_palette(&gb, get_monochrome_palette());
+}
+
G_MODULE_EXPORT void on_color_menubar_override_changed(GtkWidget *w, gpointer user_data_gptr) {
config.menubar_override = (gchar *)gtk_combo_box_get_active_id(GTK_COMBO_BOX(w));
}
@@ -1994,7 +2001,7 @@ static void vblank(GB_gameboy_t *gb) {
if (border_mode_changed) {
GB_set_border_mode(gb, get_display_border_mode());
update_window_geometry();
-
+
border_mode_changed = false;
}
@@ -2211,6 +2218,8 @@ static void reset(GuiData *gui_data) {
GB_switch_model_and_reset(&gb, current_model);
}
+ GB_set_palette(&gb, get_monochrome_palette());
+
gui_data->prev_model = get_model();
GtkRequisition minimum_size;
diff --git a/gtk3/main.h b/gtk3/main.h
index b2b090f..a4250d8 100644
--- a/gtk3/main.h
+++ b/gtk3/main.h
@@ -142,6 +142,7 @@ G_MODULE_EXPORT void on_cgb_model_changed(GtkWidget *w, gpointer user_data_gptr)
G_MODULE_EXPORT void on_color_correction_changed(GtkWidget *w, gpointer user_data_gptr);
G_MODULE_EXPORT void on_frame_blending_changed(GtkWidget *w, gpointer user_data_gptr);
G_MODULE_EXPORT void on_display_border_changed(GtkWidget *w, gpointer user_data_gptr);
+G_MODULE_EXPORT void on_monochrome_palette_changed(GtkWidget *w, gpointer user_data_gptr);
G_MODULE_EXPORT void on_color_menubar_override_changed(GtkWidget *w, gpointer user_data_gptr);
G_MODULE_EXPORT void on_dmg_model_changed(GtkWidget *w, gpointer user_data_gptr);
G_MODULE_EXPORT void on_graphic_filter_changed(GtkWidget *w, gpointer user_data_gptr);
diff --git a/gtk3/resources/ui/window.ui b/gtk3/resources/ui/window.ui
index 8d2deef..b439be4 100644
--- a/gtk3/resources/ui/window.ui
+++ b/gtk3/resources/ui/window.ui
@@ -555,6 +555,7 @@ Maximilian Mader https://github.com/max-m
16
16
vertical
+
+
+
+
+
+ True
+ False
+ 5
+ 10
+
+ - Greyscale
+ - Lime (Game Boy)
+ - Olive (Pocket)
+ - Teal (Light)
+
+
+
+
+ False
+ True
+ 7
+
+
+
+
+
+ True
+ False
+ Display Border:
+
+
+ False
+ True
+ 8
+
+
True
@@ -690,7 +726,7 @@ Maximilian Mader https://github.com/max-m
False
True
- 7
+ 9
@@ -708,9 +744,10 @@ Maximilian Mader https://github.com/max-m
False
True
- 8
+ 10
+
Keep Aspect Ratio
@@ -725,9 +762,10 @@ Maximilian Mader https://github.com/max-m
False
True
- 9
+ 11
+
@@ -753,7 +791,7 @@ Maximilian Mader https://github.com/max-m
False
True
- 11
+ 13
@@ -761,6 +799,7 @@ Maximilian Mader https://github.com/max-m
1
+
True
diff --git a/gtk3/settings.c b/gtk3/settings.c
index 641a80f..ab37c2d 100644
--- a/gtk3/settings.c
+++ b/gtk3/settings.c
@@ -110,6 +110,7 @@ void on_preferences_realize(GtkWidget *w, gpointer builder_ptr) {
gtk_combo_box_set_active_id(builder_get(GTK_COMBO_BOX, "color_correction_selector"), config.color_correction_id);
gtk_combo_box_set_active_id(builder_get(GTK_COMBO_BOX, "frame_blending_selector"), config.frame_blending_mode);
gtk_combo_box_set_active_id(builder_get(GTK_COMBO_BOX, "display_border_selector"), config.display_border_mode);
+ gtk_combo_box_set_active_id(builder_get(GTK_COMBO_BOX, "monochrome_palette_selector"), config.monochrome_palette_id);
gtk_toggle_button_set_active(builder_get(GTK_TOGGLE_BUTTON, "integer_scaling_toggle"), config.use_integer_scaling);
gtk_toggle_button_set_active(builder_get(GTK_TOGGLE_BUTTON, "aspect_ratio_toggle"), config.keep_aspect_ratio);
gtk_combo_box_set_active_id(builder_get(GTK_COMBO_BOX, "highpass_filter_selector"), config.high_pass_filter_id);
@@ -326,7 +327,7 @@ GB_border_mode_t get_display_border_mode(void) {
}
// This should not happen
- g_warning("Unknown frame blending mode: %s\nFalling back to “Never”", config.display_border_mode);
+ g_warning("Unknown SGB border mode: %s\nFalling back to “Never”", config.display_border_mode);
default_value: return GB_BORDER_NEVER;
}
@@ -344,6 +345,44 @@ void set_display_border_mode(GB_border_mode_t mode) {
}
}
+const GB_palette_t* get_monochrome_palette(void) {
+ if (config.monochrome_palette_id == NULL) goto default_value;
+
+ if (g_strcmp0(config.monochrome_palette_id, "greyscale") == 0) {
+ return &GB_PALETTE_GREY;
+ }
+ else if (g_strcmp0(config.monochrome_palette_id, "lime") == 0) {
+ return &GB_PALETTE_DMG;
+ }
+ else if (g_strcmp0(config.monochrome_palette_id, "olive") == 0) {
+ return &GB_PALETTE_MGB;
+ }
+ else if (g_strcmp0(config.monochrome_palette_id, "teal") == 0) {
+ return &GB_PALETTE_GBL;
+ }
+
+ // This should not happen
+ g_warning("Unknown monochrome palette: %s\nFalling back to “Greyscale”", config.monochrome_palette_id);
+ default_value: return &GB_PALETTE_GREY;
+}
+
+void set_monochrome_palette(const GB_palette_t *mode) {
+ g_message("%p | %p | %p | %p | %p", mode, &GB_PALETTE_GREY, &GB_PALETTE_DMG, &GB_PALETTE_MGB, &GB_PALETTE_GBL);
+
+ if (mode == &GB_PALETTE_GREY) {
+ config.monochrome_palette_id = "greyscale";
+ }
+ else if (mode == &GB_PALETTE_DMG) {
+ config.monochrome_palette_id = "lime";
+ }
+ else if (mode == &GB_PALETTE_MGB) {
+ config.monochrome_palette_id = "olive";
+ }
+ else if (mode == &GB_PALETTE_GBL) {
+ config.monochrome_palette_id = "teal";
+ }
+}
+
GB_highpass_mode_t get_highpass_mode(void) {
if (config.high_pass_filter_id == NULL) goto default_value;
diff --git a/gtk3/settings.h b/gtk3/settings.h
index e884b9c..0c34d5b 100644
--- a/gtk3/settings.h
+++ b/gtk3/settings.h
@@ -42,6 +42,7 @@
EXPAND_GROUP_MEMBER(color_correction_id, string, "emulate_hardware") \
EXPAND_GROUP_MEMBER(frame_blending_mode, string, "disabled") \
EXPAND_GROUP_MEMBER(display_border_mode, string, "never") \
+ EXPAND_GROUP_MEMBER(monochrome_palette_id, string, "greyscale") \
EXPAND_GROUP_MEMBER(keep_aspect_ratio, boolean, true) \
EXPAND_GROUP_MEMBER(use_integer_scaling, boolean, true) \
EXPAND_GROUP_MEMBER(menubar_override, string, "auto") \
@@ -100,6 +101,9 @@ void set_display_border_mode(GB_border_mode_t);
GB_highpass_mode_t get_highpass_mode(void);
void set_highpass_mode(GB_highpass_mode_t);
+const GB_palette_t* get_monochrome_palette(void);
+void set_monochrome_palette(const GB_palette_t*);
+
GB_model_t get_dmg_model(void);
GB_model_t get_sgb_model(void);
GB_model_t get_cgb_model(void);