#ifndef settings_h #define settings_h #include #include #include "shader.h" #define SETTINGS_FILE "sameboy-gtk3-settings.ini" #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_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 // Macro usage: // EXPAND_CONFIG(EXPAND_GROUP(…) EXPAND_GROUP(…) …) // EXPAND_GROUP(group_name, group_members) // EXPAND_GROUP_MEMBER(member_name, key_type, default_value) #define EXPAND_CONFIG \ EXPAND_GROUP(emulation, \ EXPAND_GROUP_MEMBER(boot_rom_path, string, "auto") /* overrides search location for boot ROMs by name */ \ EXPAND_GROUP_MEMBER(rewind_duration, integer, 10) \ EXPAND_GROUP_MEMBER(dmg_revision_name, string, "DMG_CPU_C") \ EXPAND_GROUP_MEMBER(sgb_revision_name, string, "SGB2") \ EXPAND_GROUP_MEMBER(cgb_revision_name, string, "CPU_CGB_E") \ ) \ EXPAND_GROUP(video, \ EXPAND_GROUP_MEMBER(shader, string, "NearestNeighbor") \ 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") \ ) \ EXPAND_GROUP(audio, \ EXPAND_GROUP_MEMBER(high_pass_filter_id, string, "emulate_hardware") \ EXPAND_GROUP_MEMBER(sample_rate, integer, -1) \ ) \ EXPAND_GROUP(controls, \ EXPAND_GROUP_MEMBER(analog_speed_controls, boolean, false) \ EXPAND_GROUP_MEMBER(rumble_mode, string, "Never") \ ) typedef struct config_t { #define EXPAND_GROUP(group_name, members) struct config_ ## group_name ## _t { \ members \ } group_name; #define EXPAND_GROUP_MEMBER(member, key_type, default_value) GTYPE_OF_KEY_TYPE(key_type) member; EXPAND_CONFIG #undef EXPAND_GROUP #undef EXPAND_GROUP_MEMBER } config_t; enum menubar_type_t { MENUBAR_AUTO, MENUBAR_SHOW_IN_SHELL, MENUBAR_SHOW_IN_WINDOW, MENUBAR_SHOW_HAMBURGER }; gchar* settings_file_path; GKeyFile *key_file; config_t config; void on_preferences_realize(GtkWidget *w, gpointer builder_ptr); void print_config(config_t *config); void load_config_from_key_file(config_t *config, GKeyFile *key_file); void init_settings(gchar *path, GtkWindow *preferences); int load_settings(void); void save_settings(void); void free_settings(void); void update_boot_rom_selector(GtkBuilder *builder); enum menubar_type_t get_show_menubar(void); void set_show_menubar(enum menubar_type_t); GB_color_correction_mode_t get_color_correction_mode(void); void set_color_correction_mode(GB_color_correction_mode_t); GB_frame_blending_mode_t get_frame_blending_mode(void); void set_frame_blending_mode(GB_frame_blending_mode_t); GB_border_mode_t get_display_border_mode(void); 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*); const GB_rumble_mode_t get_rumble_mode(void); void set_rumble_mode(const GB_rumble_mode_t); GB_model_t get_dmg_model(void); GB_model_t get_sgb_model(void); GB_model_t get_cgb_model(void); #endif /* settings_h */