From d60df680bb692a4ff30727acbfb357aa56b85f48 Mon Sep 17 00:00:00 2001 From: Maximilian Mader Date: Wed, 25 Sep 2019 22:47:04 +0200 Subject: [PATCH] [GTK3] Save settings to key file --- gtk3/settings.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++-- gtk3/settings.h | 39 +++++++++------ 2 files changed, 146 insertions(+), 18 deletions(-) diff --git a/gtk3/settings.c b/gtk3/settings.c index c2620b8..4f7aae5 100644 --- a/gtk3/settings.c +++ b/gtk3/settings.c @@ -3,7 +3,7 @@ static void print_config_error(GError *error) { if (error == NULL) return; - if (error->domain != G_KEY_FILE_ERROR_GROUP_NOT_FOUND && error->domain != G_KEY_FILE_ERROR_KEY_NOT_FOUND) { + if (!g_error_matches(error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND) && !g_error_matches(error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { g_printerr("Config error: %s\n", error->message); } } @@ -23,7 +23,7 @@ void print_config(config_t *config) { } void load_config_from_key_file(config_t *config, GKeyFile *key_file) { - static GError *error = NULL; + GError *error = NULL; gchar *group_name; #define EXPAND_GROUP(name, members) \ @@ -35,7 +35,7 @@ void load_config_from_key_file(config_t *config, GKeyFile *key_file) { #define EXPAND_GROUP_MEMBER(member, key_type) \ config->member = g_key_file_get_##key_type(key_file, group_name, #member, &error); \ print_config_error(error); \ - if (error != NULL) g_clear_error(&error); + g_clear_error(&error); EXPAND_CONFIG @@ -47,7 +47,45 @@ void load_config_from_key_file(config_t *config, GKeyFile *key_file) { #undef EXPAND_GROUP_MEMBER } -void init_settings(gchar *path) { +void save_config_to_key_file(config_t *config, GKeyFile *key_file) { + GError *error = NULL; + gchar *group_name; + +#define EXPAND_GROUP(name, members) \ + group_name = #name; \ + members + +#define EXPAND_GROUP_MEMBER_IF_0(member, key_type) \ + g_key_file_set_##key_type(key_file, group_name, #member, config->member); + +#define EXPAND_GROUP_MEMBER_IF_1(member, key_type) \ + if (config->member != NULL) { \ + g_key_file_set_##key_type(key_file, group_name, #member, config->member); \ + } \ + else { \ + GError *error = NULL; \ + g_key_file_remove_key(key_file, group_name, #member, &error); \ + if (error != NULL) { \ + g_printerr("%s\n", error->message); \ + g_clear_error(&error); \ + } \ + } + +#define EXPAND_GROUP_MEMBER_IF_EVAL(y, member, key_type) EXPAND_GROUP_MEMBER_IF_ ## y(member, key_type) +#define EXPAND_GROUP_MEMBER_IF(member, key_type, is_pointer) EXPAND_GROUP_MEMBER_IF_EVAL(is_pointer, member, key_type) +#define EXPAND_GROUP_MEMBER(member, key_type) EXPAND_GROUP_MEMBER_IF(member, key_type, GTYPE_IS_POINTER(key_type)) + + EXPAND_CONFIG + +#undef EXPAND_GROUP +#undef EXPAND_GROUP_MEMBER +#undef EXPAND_GROUP_MEMBER_IF +#undef EXPAND_GROUP_MEMBER_IF_EVAL +#undef EXPAND_GROUP_MEMBER_IF_0 +#undef EXPAND_GROUP_MEMBER_IF_1 +} + +void init_settings(gchar *path, GtkWindow *preferences) { free_settings(); key_file = g_key_file_new(); @@ -89,6 +127,8 @@ void save_settings(void) { g_print("Trying to save settings to %s\n", settings_file_path); + save_config_to_key_file(&config, key_file); + if (!g_key_file_save_to_file(key_file, settings_file_path, &error)) { g_warning ("Failed to save %s: %s", settings_file_path, error->message); g_error_free(error); @@ -102,3 +142,80 @@ void free_settings(void) { key_file = NULL; } } + +enum menubar_override get_show_menubar(void) { + if (g_strcmp0(config.menubar_override, "show") == 0) { + return MENUBAR_SHOW; + } + else if (g_strcmp0(config.menubar_override, "hide") == 0) { + return MENUBAR_HIDE; + } + + return MENUBAR_AUTO; +} + +void set_show_menubar(enum menubar_override value) { + switch (value) { + case MENUBAR_AUTO: + config.menubar_override = "auto"; + break; + case MENUBAR_SHOW: + config.menubar_override = "show"; + break; + case MENUBAR_HIDE: + config.menubar_override = "hide"; + break; + } +} + +G_MODULE_EXPORT void on_highpass_filter_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} + +G_MODULE_EXPORT void on_use_integer_scaling_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkCheckButton *button = GTK_CHECK_BUTTON(w); + gboolean value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + config.use_integer_scaling = value; +} + +G_MODULE_EXPORT void on_keep_aspect_ratio_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkCheckButton *button = GTK_CHECK_BUTTON(w); + gboolean value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + config.keep_aspect_ratio = value; +} + +G_MODULE_EXPORT void on_color_correction_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} + +G_MODULE_EXPORT void on_graphic_filter_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + config.shader = (gchar *)gtk_combo_box_get_active_id(box); +} + +G_MODULE_EXPORT void on_cgb_model_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} + +G_MODULE_EXPORT void on_sgb_model_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} + +G_MODULE_EXPORT void on_dmg_model_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} + +G_MODULE_EXPORT void on_rewind_duration_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} + +G_MODULE_EXPORT void on_boot_rom_location_changed(GtkWidget *w, gpointer user_data_gptr) { + GtkComboBox *box = GTK_COMBO_BOX(w); + g_print("New value: %s\n", gtk_combo_box_get_active_id(box)); +} diff --git a/gtk3/settings.h b/gtk3/settings.h index be84182..daf92c4 100644 --- a/gtk3/settings.h +++ b/gtk3/settings.h @@ -1,20 +1,24 @@ #ifndef settings_h #define settings_h -#include -#include +#include #define SETTINGS_FILE "sameboy-gtk3-settings.ini" -#define FORMAT_FOR_KEY_TYPE(type) KEY_FORMAT_##type -#define KEY_FORMAT_string "%s" -#define KEY_FORMAT_integer "%d" -#define KEY_FORMAT_boolean "%d" +#define FORMAT_FOR_KEY_TYPE(type) FORMAT_FOR_##type +#define FORMAT_FOR_string "%s" +#define FORMAT_FOR_integer "%d" +#define FORMAT_FOR_boolean "%d" -#define GTYPE_FOR_KEY_TYPE(type) GTYPE_##type -#define GTYPE_string gchar * -#define GTYPE_integer gint -#define GTYPE_boolean gboolean +#define GTYPE_OF_KEY_TYPE(type) GTYPE_OF_##type +#define GTYPE_OF_string gchar * +#define GTYPE_OF_integer gint +#define GTYPE_OF_boolean gboolean + +#define GTYPE_IS_POINTER(type) GTYPE_IS_POINTER_##type +#define GTYPE_IS_POINTER_string 1 +#define GTYPE_IS_POINTER_integer 0 +#define GTYPE_IS_POINTER_boolean 0 // Note: Make sure to use a member name only once for the whole config struct #define EXPAND_CONFIG \ @@ -30,6 +34,7 @@ EXPAND_GROUP_MEMBER(color_correction_id, string) \ EXPAND_GROUP_MEMBER(keep_aspect_ratio, boolean) \ EXPAND_GROUP_MEMBER(use_integer_scaling, boolean) \ + EXPAND_GROUP_MEMBER(menubar_override, string) \ ) \ EXPAND_GROUP(Audio, \ EXPAND_GROUP_MEMBER(high_pass_filter_id, string) \ @@ -40,12 +45,18 @@ typedef struct config_t { #define EXPAND_GROUP(group_name, members) members -#define EXPAND_GROUP_MEMBER(member, key_type) GTYPE_FOR_KEY_TYPE(key_type) member; +#define EXPAND_GROUP_MEMBER(member, key_type) GTYPE_OF_KEY_TYPE(key_type) member; EXPAND_CONFIG #undef EXPAND_GROUP #undef EXPAND_GROUP_MEMBER } config_t; +enum menubar_override { + MENUBAR_AUTO, + MENUBAR_SHOW, + MENUBAR_HIDE +}; + gchar* settings_file_path; GKeyFile *key_file; config_t config; @@ -53,12 +64,12 @@ config_t config; void print_config(config_t *config); void load_config_from_key_file(config_t *config, GKeyFile *key_file); -void init_settings(gchar *path); +void init_settings(gchar *path, GtkWindow *preferences); int load_settings(void); void save_settings(void); void free_settings(void); -enum scaling_mode get_scaling_mode(void); -void set_scaling_mode(enum scaling_mode); +enum menubar_override get_show_menubar(void); +void set_show_menubar(enum menubar_override); #endif /* settings_h */