X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=player%2Fpreferences.c;h=5ee62ed6be797156bc4a43e4777fd1ece155f15a;hb=82bf403ab4af1f293c0e1eda447613242c48cda9;hp=157a784c3d3cacce1065361364b654da8f2e5785;hpb=0b4a489488a68d57f4fc9fb785f932df2184d202;p=projects%2Fchimara%2Fchimara.git diff --git a/player/preferences.c b/player/preferences.c index 157a784..5ee62ed 100644 --- a/player/preferences.c +++ b/player/preferences.c @@ -43,6 +43,72 @@ static GtkTextTag *current_tag; static void style_tree_select_callback(GtkTreeSelection *selection, ChimaraGlk *glk); +/* Internal functions to convert from human-readable names in the config file +to enums and back. Later: replace with plugin functions. */ +static ChimaraIFFormat +parse_format(const char *format) +{ + if(strcmp(format, "z5") == 0) + return CHIMARA_IF_FORMAT_Z5; + if(strcmp(format, "z6") == 0) + return CHIMARA_IF_FORMAT_Z6; + if(strcmp(format, "z8") == 0) + return CHIMARA_IF_FORMAT_Z8; + if(strcmp(format, "zblorb") == 0) + return CHIMARA_IF_FORMAT_Z_BLORB; + if(strcmp(format, "glulx") == 0) + return CHIMARA_IF_FORMAT_GLULX; + if(strcmp(format, "gblorb") == 0) + return CHIMARA_IF_FORMAT_GLULX_BLORB; + return CHIMARA_IF_FORMAT_NONE; +} + +static const char *format_display_strings[CHIMARA_IF_NUM_FORMATS] = { + N_("Z-machine version 5"), + N_("Z-machine version 6"), + N_("Z-machine version 8"), + N_("Z-machine Blorb file"), + N_("Glulx"), + N_("Glulx Blorb file") +}; + +static const char * +format_to_display_string(ChimaraIFFormat format) +{ + if(format < CHIMARA_IF_NUM_FORMATS) + return gettext(format_display_strings[format]); + return _("Unknown"); +} + +static ChimaraIFInterpreter +parse_interpreter(const char *interp) +{ + if(strcmp(interp, "frotz") == 0) + return CHIMARA_IF_INTERPRETER_FROTZ; + if(strcmp(interp, "nitfol") == 0) + return CHIMARA_IF_INTERPRETER_NITFOL; + if(strcmp(interp, "glulxe") == 0) + return CHIMARA_IF_INTERPRETER_GLULXE; + if(strcmp(interp, "git") == 0) + return CHIMARA_IF_INTERPRETER_GIT; + return CHIMARA_IF_INTERPRETER_NONE; +} + +static const char *interpreter_display_strings[CHIMARA_IF_NUM_INTERPRETERS] = { + N_("Frotz"), + N_("Nitfol"), + N_("Glulxe"), + N_("Git") +}; + +static const char * +interpreter_to_display_string(ChimaraIFInterpreter interp) +{ + if(interp < CHIMARA_IF_NUM_INTERPRETERS) + return gettext(interpreter_display_strings[interp]); + return _("Unknown"); +} + /* Create the preferences dialog. */ void preferences_create(ChimaraGlk *glk) @@ -91,6 +157,44 @@ preferences_create(ChimaraGlk *glk) extern GSettings *prefs_settings; GObject *flep = G_OBJECT( load_object("flep") ); g_settings_bind(prefs_settings, "flep", flep, "active", G_SETTINGS_BIND_DEFAULT); + GtkFileChooser *blorb_chooser = GTK_FILE_CHOOSER( load_object("blorb_file_chooser") ); + char *filename; + g_settings_get(prefs_settings, "resource-path", "ms", &filename); + if(filename) { + gtk_file_chooser_set_filename(blorb_chooser, filename); + g_free(filename); + } + + /* Populate the list of available interpreters */ + GtkListStore *interp_list = GTK_LIST_STORE( load_object("available_interpreters") ); + unsigned int interp; + GtkTreeIter tree_iter; + for(interp = 0; interp < CHIMARA_IF_NUM_INTERPRETERS; interp++) { + gtk_list_store_append(interp_list, &tree_iter); + gtk_list_store_set(interp_list, &tree_iter, + 0, interpreter_to_display_string(interp), + -1); + } + + /* Initialize the list of preferred interpreters */ + GtkListStore *preferred_list = GTK_LIST_STORE( load_object("interpreters") ); + GVariantIter *iter; + char *format, *plugin; + g_settings_get(prefs_settings, "preferred-interpreters", "a{ss}", &iter); + while(g_variant_iter_loop(iter, "{ss}", &format, &plugin)) { + ChimaraIFFormat format_num = parse_format(format); + if(format_num == CHIMARA_IF_FORMAT_NONE) + continue; + ChimaraIFInterpreter interp_num = parse_interpreter(plugin); + if(interp_num == CHIMARA_IF_INTERPRETER_NONE) + continue; + gtk_list_store_append(preferred_list, &tree_iter); + gtk_list_store_set(preferred_list, &tree_iter, + 0, format_to_display_string(format_num), + 1, interpreter_to_display_string(interp_num), + -1); + } + g_variant_iter_free(iter); } static void @@ -240,3 +344,12 @@ on_font_set(GtkFontButton *button, ChimaraGlk *glk) g_object_set(current_tag, "font-desc", font_description, NULL); chimara_glk_update_style(glk); } + +void +on_resource_file_set(GtkFileChooserButton *button, ChimaraGlk *glk) +{ + extern GSettings *prefs_settings; + char *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(button) ); + g_settings_set(prefs_settings, "resource-path", "ms", filename); + g_free(filename); +}