1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
6 * settings.c is free software.
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
17 #include <glib/gstdio.h>
21 #include "hb-backend.h"
23 void dump_settings(GHashTable *settings);
26 debug_get_object(GtkBuilder* b, const gchar *n)
28 g_message("name %s\n", n);
29 return gtk_builder_get_object(b, n);
32 static gchar *true_strings[] =
41 string_is_true(const gchar *str)
43 gint count = sizeof(true_strings) / sizeof(gchar*);
46 for (ii = 0; ii < count; ii++)
48 if (strcmp(str, true_strings[ii]) == 0)
57 delete_key(gpointer str)
59 g_debug("delete_key (%s)\n", (gchar*)str);
64 delete_value(gpointer val)
66 g_debug("delete_value (%s)\n", ((setting_value_t*)val)->svalue);
67 g_free(((setting_value_t*)val)->svalue);
68 g_free(((setting_value_t*)val)->option);
69 g_free(((setting_value_t*)val)->shortOpt);
74 ghb_free_setting_value(setting_value_t *val)
76 delete_value((gpointer)val);
84 g_debug("ghb_settings_new ()\n");
85 settings = g_hash_table_new_full(g_str_hash, g_str_equal,
86 delete_key, delete_value);
91 settings_set(GHashTable *settings, const gchar *key,
92 const gchar *str, gint val, gdouble dbl)
94 g_debug("ghb_setting_set () key (%s), svalue (%s), ivalue %d, dvalue %.2g\n", key, str, val, dbl);
95 setting_value_t *value = g_malloc(sizeof(setting_value_t));
97 value->svalue = g_strdup(str);
99 value->svalue = g_strdup("");
100 value->option = g_strdup(value->svalue);
101 value->shortOpt = g_strdup(value->svalue);
105 g_hash_table_insert(settings, g_strdup(key), value);
108 static setting_value_t*
109 copy_settings_value(const setting_value_t *value)
111 setting_value_t *copy = g_malloc(sizeof(setting_value_t));
112 copy->index = value->index;
113 copy->ivalue = value->ivalue;
114 copy->dvalue = value->dvalue;
115 copy->svalue = g_strdup(value->svalue);
116 copy->option = g_strdup(value->option);
117 copy->shortOpt = g_strdup(value->shortOpt);
122 ghb_settings_set(GHashTable *settings, const gchar *key, setting_value_t *value)
124 g_debug("ghb_settings_set () key (%s)\n", key);
125 if ((key == NULL) || (value == NULL))
127 g_debug("Bad key or value\n");
130 g_debug("\tkey (%s) -- value (%s)\n", key, value->svalue);
131 g_hash_table_insert(settings, g_strdup(key), value);
135 ghb_settings_set_string(GHashTable *settings, const gchar *key, const gchar *str)
140 if (str == NULL) str = "";
141 dvalue = g_strtod (str, &end);
142 if ((end == str) && string_is_true (str))
146 settings_set(settings, key, str, dvalue, dvalue);
150 ghb_settings_set_dbl(GHashTable *settings, const gchar *key, gdouble dvalue)
152 setting_value_t *value;
154 value = g_malloc(sizeof(setting_value_t));
156 value->dvalue = dvalue;
157 value->option = g_strdup_printf("%.8g", dvalue);
158 value->shortOpt = g_strdup(value->option);
159 value->svalue = g_strdup(value->option);
160 value->ivalue = dvalue;
161 ghb_settings_set( settings, key, value);
165 ghb_settings_copy(GHashTable *settings, const gchar *key, const setting_value_t *value)
167 setting_value_t *copy = copy_settings_value(value);
168 g_hash_table_insert(settings, g_strdup(key), copy);
171 const setting_value_t*
172 ghb_settings_get(GHashTable *settings, const gchar *key)
174 const setting_value_t* value;
175 g_debug("ghb_settings_get () key (%s)\n", key);
176 value = g_hash_table_lookup(settings, key);
181 ghb_settings_get_bool(GHashTable *settings, const gchar *key)
183 const setting_value_t* value;
184 g_debug("ghb_settings_get_bool () key (%s)\n", key);
185 value = ghb_settings_get(settings, key);
188 g_debug("\tNo value found\n");
191 g_debug("\tvalue is %d\n", value->ivalue);
192 return value->ivalue;
196 ghb_settings_get_int(GHashTable *settings, const gchar *key)
198 const setting_value_t* value;
199 g_debug("ghb_settings_get_int () key (%s)\n", key);
200 value = ghb_settings_get(settings, key);
201 if (value == NULL) return 0;
202 return value->ivalue;
206 ghb_settings_get_index(GHashTable *settings, const gchar *key)
208 const setting_value_t* value;
209 g_debug("ghb_settings_get_index () key (%s)\n", key);
210 value = ghb_settings_get(settings, key);
211 if (value == NULL) return 0;
216 ghb_settings_get_dbl(GHashTable *settings, const gchar *key)
218 const setting_value_t* value;
219 g_debug("ghb_settings_get_dbl () key (%s)\n", key);
220 value = ghb_settings_get(settings, key);
221 if (value == NULL) return 0.0;
222 return value->dvalue;
226 ghb_settings_get_string(GHashTable *settings, const gchar *key)
228 const setting_value_t* value;
229 g_debug("ghb_settings_get_string () key (%s)\n", key);
230 value = ghb_settings_get(settings, key);
231 if (value == NULL) return "";
232 return value->svalue;
237 ghb_settings_get_option(GHashTable *settings, const gchar *key)
239 const setting_value_t* value;
240 g_debug("ghb_settings_get_option () key (%s)\n", key);
241 value = ghb_settings_get(settings, key);
242 if (value == NULL) return "";
243 g_debug("option: (%s)\n", value->option);
244 return value->option;
248 ghb_settings_get_short_opt(GHashTable *settings, const gchar *key)
250 const setting_value_t* value;
251 g_debug("ghb_settings_get_short_opt () key (%s)\n", key);
252 value = ghb_settings_get(settings, key);
253 if (value == NULL) return "";
254 g_debug("shrot option: (%s)\n", value->shortOpt);
255 return value->shortOpt;
259 copy_key_val(gpointer key, gpointer val, gpointer settings)
261 g_hash_table_insert((GHashTable*)settings,
262 g_strdup((gchar*)key),
263 copy_settings_value((setting_value_t*)val));
267 ghb_settings_dup(GHashTable *settings)
269 GHashTable *dup_settings;
271 if (settings == NULL) return NULL;
272 dup_settings = ghb_settings_new();
273 g_hash_table_foreach (settings, copy_key_val, dup_settings);
277 // Map widget names to setting keys
278 // Widgets that map to settings have names
279 // of this format: s_<setting key>
281 get_setting_key(GtkWidget *widget)
285 g_debug("get_setting_key ()\n");
286 if (widget == NULL) return NULL;
287 if (GTK_IS_ACTION(widget))
288 name = gtk_action_get_name(GTK_ACTION(widget));
290 name = gtk_widget_get_name(widget);
294 // Bad widget pointer? Should never happen.
295 g_debug("Bad widget\n");
302 ghb_widget_value(GtkWidget *widget)
304 setting_value_t *value;
310 g_debug("NULL widget\n");
313 value = g_malloc(sizeof(setting_value_t));
314 if (GTK_IS_ACTION(widget))
315 name = gtk_action_get_name(GTK_ACTION(widget));
317 name = gtk_widget_get_name(widget);
318 g_debug("ghb_widget_value widget (%s)\n", name);
319 type = GTK_OBJECT_TYPE(widget);
320 if (type == GTK_TYPE_ENTRY)
322 const gchar *str = gtk_entry_get_text((GtkEntry*)widget);
323 value->option = g_strdup(str);
324 value->shortOpt = g_strdup(str);
325 value->svalue = g_strdup(str);
326 value->dvalue = g_strtod(str, NULL);
327 value->ivalue = value->dvalue;
330 else if (type == GTK_TYPE_RADIO_BUTTON)
332 g_debug("\tradio_button");
334 if (gtk_toggle_button_get_active((GtkToggleButton*)widget))
337 value->option = g_strdup("enable");
338 value->shortOpt = g_strdup("enable");
339 value->svalue = g_strdup("enable");
345 g_debug("\tdisable");
346 value->option = g_strdup("disable");
347 value->shortOpt = g_strdup("disable");
348 value->svalue = g_strdup("disable");
353 else if (type == GTK_TYPE_CHECK_BUTTON)
355 g_debug("\tcheck_button");
357 if (gtk_toggle_button_get_active((GtkToggleButton*)widget))
360 value->option = g_strdup("enable");
361 value->shortOpt = g_strdup("enable");
362 value->svalue = g_strdup("enable");
368 g_debug("\tdisable");
369 value->option = g_strdup("disable");
370 value->shortOpt = g_strdup("disable");
371 value->svalue = g_strdup("disable");
376 else if (type == GTK_TYPE_TOGGLE_ACTION)
378 g_debug("\ttoggle action");
380 if (gtk_toggle_action_get_active((GtkToggleAction*)widget))
383 value->option = g_strdup("enable");
384 value->shortOpt = g_strdup("enable");
385 value->svalue = g_strdup("enable");
391 g_debug("\tdisable");
392 value->option = g_strdup("disable");
393 value->shortOpt = g_strdup("disable");
394 value->svalue = g_strdup("disable");
399 else if (type == GTK_TYPE_CHECK_MENU_ITEM)
401 g_debug("\tcheck_menu_item");
403 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
406 value->option = g_strdup("enable");
407 value->shortOpt = g_strdup("enable");
408 value->svalue = g_strdup("enable");
414 g_debug("\tdisable");
415 value->option = g_strdup("disable");
416 value->shortOpt = g_strdup("disable");
417 value->svalue = g_strdup("disable");
422 else if (type == GTK_TYPE_COMBO_BOX)
426 gchar *shortOpt, *option, *svalue;
428 gint index = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
430 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
431 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
433 gtk_tree_model_get(store, &iter, 0, &option, 2, &shortOpt,
434 3, &ivalue, 4, &svalue, -1);
436 g_debug("\tcombo: index %d opt (%s) Short Opt (%s) value %d\n", index, option, shortOpt, ivalue);
437 value->option = option;
438 value->shortOpt = shortOpt;
439 value->svalue = svalue;
440 value->index = index;
441 value->ivalue = ivalue;
442 value->dvalue = ivalue;
446 value->option = g_strdup("");
447 value->shortOpt = g_strdup("");
448 value->svalue = g_strdup("");
454 else if (type == GTK_TYPE_SPIN_BUTTON)
457 value->dvalue = gtk_spin_button_get_value_as_int((GtkSpinButton*)widget);
458 value->option = g_strdup_printf("%.8g", value->dvalue);
459 value->shortOpt = g_strdup_printf("%.8g", value->dvalue);
460 value->svalue = g_strdup_printf("%.8g", value->dvalue);
461 value->ivalue = value->dvalue;
463 else if (type == GTK_TYPE_HSCALE)
466 value->dvalue = gtk_range_get_value((GtkRange*)widget);
467 value->option = g_strdup_printf("%.8g", value->dvalue);
468 value->shortOpt = g_strdup_printf("%.8g", value->dvalue);
469 value->svalue = g_strdup_printf("%.8g", value->dvalue);
470 value->ivalue = value->dvalue;
472 else if (type == GTK_TYPE_TEXT_VIEW)
474 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
475 GtkTextIter start, end;
476 gtk_text_buffer_get_bounds(buffer, &start, &end);
477 value->svalue = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
478 value->option = g_strdup(value->svalue);
479 value->shortOpt = g_strdup(value->svalue);
480 g_debug("text view (%s)\n", value->svalue);
485 else if (type == GTK_TYPE_LABEL)
488 value->svalue = g_strdup(gtk_label_get_text (GTK_LABEL(widget)));
489 value->dvalue = g_strtod(value->svalue, NULL);
490 value->option = g_strdup(value->svalue);
491 value->shortOpt = g_strdup(value->svalue);
492 value->ivalue = value->dvalue;
493 g_debug("label (%s)\n", value->shortOpt);
497 g_debug("Attempt to set unknown widget type: %s\n", name);
505 ghb_widget_option(GtkWidget *widget)
507 setting_value_t *value;
510 g_debug("ghb_widget_option ()\n");
511 value = ghb_widget_value(widget);
514 str = g_strdup(value->option);
515 ghb_free_setting_value (value);
521 ghb_widget_short_opt(GtkWidget *widget)
523 setting_value_t *value;
526 g_debug("ghb_widget_short_opt ()\n");
527 value = ghb_widget_value(widget);
530 str = g_strdup(value->shortOpt);
531 ghb_free_setting_value (value);
537 ghb_widget_string(GtkWidget *widget)
539 setting_value_t *value;
542 g_debug("ghb_widget_string ()\n");
543 value = ghb_widget_value(widget);
546 g_debug("str (%s)\n", value->svalue);
547 str = g_strdup(value->svalue);
548 ghb_free_setting_value (value);
554 ghb_widget_dbl(GtkWidget *widget)
556 setting_value_t *value;
559 g_debug("ghb_widget_dbl ()\n");
560 value = ghb_widget_value(widget);
564 ghb_free_setting_value (value);
570 ghb_widget_int(GtkWidget *widget)
572 setting_value_t *value;
575 g_debug("ghb_widget_int ()\n");
576 value = ghb_widget_value(widget);
579 ivalue = value->ivalue;
580 ghb_free_setting_value (value);
586 ghb_widget_index(GtkWidget *widget)
588 setting_value_t *value;
591 g_debug("ghb_widget_index ()\n");
592 value = ghb_widget_value(widget);
595 index = value->index;
596 ghb_free_setting_value (value);
602 ghb_widget_to_setting(GHashTable *settings, GtkWidget *widget)
604 const gchar *key = NULL;
605 setting_value_t *value;
607 g_debug("ghb_widget_to_setting ()\n");
608 if (widget == NULL) return;
609 // Find corresponding setting
610 key = get_setting_key(widget);
611 if (key == NULL) return;
612 value = ghb_widget_value(widget);
615 ghb_settings_set (settings, key, value);
619 g_debug("No value found for %s\n", key);
621 //dump_settings(settings);
625 update_widget(GtkWidget *widget, const gchar *parm_svalue, gint parm_ivalue)
630 g_debug("update_widget\n");
631 // make a dup of setting value because the setting hash gets
632 // modified and thus the value pointer can become invalid.
633 if (parm_svalue == NULL)
635 value = g_strdup_printf ("%d", parm_ivalue);
639 value = g_strdup(parm_svalue);
641 g_debug("update widget value (%s)\n", value);
642 type = GTK_OBJECT_TYPE(widget);
643 if (type == GTK_TYPE_ENTRY)
646 gtk_entry_set_text((GtkEntry*)widget, value);
648 else if (type == GTK_TYPE_RADIO_BUTTON)
650 g_debug("radio button\n");
651 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), string_is_true(value));
653 else if (type == GTK_TYPE_CHECK_BUTTON)
655 g_debug("check button\n");
656 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), string_is_true(value));
658 else if (type == GTK_TYPE_TOGGLE_ACTION)
660 g_debug("toggle action\n");
661 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(widget), string_is_true(value));
663 else if (type == GTK_TYPE_CHECK_MENU_ITEM)
665 g_debug("check menu item\n");
666 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), string_is_true(value));
668 else if (type == GTK_TYPE_COMBO_BOX)
674 gboolean foundit = FALSE;
676 store = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
677 if (gtk_tree_model_get_iter_first (store, &iter))
681 gtk_tree_model_get(store, &iter, 2, &shortOpt, 3, &ivalue, -1);
682 if (parm_svalue == NULL && ivalue == parm_ivalue)
684 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
689 else if (strcmp(shortOpt, value) == 0)
691 gtk_combo_box_set_active_iter (GTK_COMBO_BOX(widget), &iter);
697 } while (gtk_tree_model_iter_next (store, &iter));
701 gtk_combo_box_set_active (GTK_COMBO_BOX(widget), 0);
704 else if (type == GTK_TYPE_SPIN_BUTTON)
709 val = g_strtod(value, NULL);
710 gtk_spin_button_set_value((GtkSpinButton*)widget, val);
712 else if (type == GTK_TYPE_HSCALE)
717 val = g_strtod(value, NULL);
718 gtk_range_set_value((GtkRange*)widget, val);
720 else if (type == GTK_TYPE_TEXT_VIEW)
722 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
723 gtk_text_buffer_set_text (buffer, value, -1);
727 g_debug("Attempt to set unknown widget type\n");
733 ghb_ui_update(signal_user_data_t *ud, const gchar *name, const gchar *value)
737 g_debug("ghb_ui_update ()\n");
738 object = GHB_OBJECT(ud->builder, name);
741 g_debug("Failed to find widget for key: %s\n", name);
744 update_widget((GtkWidget*)object, value, 0);
745 // Its possible the value hasn't changed. Since settings are only
746 // updated when the value changes, I'm initializing settings here as well.
747 ghb_widget_to_setting(ud->settings, (GtkWidget*)object);
752 ghb_ui_update_int(signal_user_data_t *ud, const gchar *name, gint ivalue)
756 g_debug("ghb_ui_update ()\n");
757 object = GHB_OBJECT(ud->builder, name);
760 g_debug("Failed to find widget for key: %s\n", name);
763 update_widget((GtkWidget*)object, NULL, ivalue);
764 // Its possible the value hasn't changed. Since settings are only
765 // updated when the value changes, I'm initializing settings here as well.
766 ghb_widget_to_setting(ud->settings, (GtkWidget*)object);
771 show_setting(gpointer key, gpointer value, gpointer user_data)
773 printf("key (%s) -- value (%s)\n", (gchar*)key, (gchar*)value);
777 dump_settings(GHashTable *settings)
779 printf("------------------------------------\n");
780 g_hash_table_foreach(settings, show_setting, NULL);
783 // This is a bit hackish, but effective
784 const gchar defaultSettings[] =
785 #include "internal_defaults.h"
797 static GKeyFile *standardKeyFile;
798 static GKeyFile *customKeyFile;
799 static GKeyFile *internalKeyFile;
800 static GKeyFile *prefsKeyFile;
801 static GList *presetsList;
804 search_group(const gchar *name, gchar **groups)
808 //g_debug("search_group\n");
809 if (groups == NULL) return -1;
810 for (ii = 0; groups[ii] != NULL; ii++)
812 //g_debug("%s cmp %s\n", name, groups[ii]);
813 if (strcmp(name, groups[ii]) == 0)
822 presets_list_search(GList *list, const gchar *name)
827 presets_data_t *data;
828 data = (presets_data_t*)link->data;
829 g_debug("search -- %s\n", data->name);
830 if (strcmp(name, data->name) == 0)
834 link = g_list_next(link);
840 ghb_set_preset_default(GHashTable *settings)
843 presets_data_t *data;
845 preset = ghb_settings_get_string (settings, "default_preset");
846 data = presets_list_search(presetsList, preset);
849 data->defalt = FALSE;
851 preset = ghb_settings_get_string (settings, "preset");
852 data = presets_list_search(presetsList, preset);
857 ghb_settings_set_string(settings, "default_preset", preset);
858 ghb_prefs_save(settings);
862 ghb_presets_list_index(const gchar *name)
864 GList *link = presetsList;
868 presets_data_t *data;
869 data = (presets_data_t*)link->data;
870 if (strcmp(name, data->name) == 0)
874 link = g_list_next(link);
881 ghb_preset_flags(const gchar *name, gint *index)
883 GList *link = presetsList;
887 presets_data_t *data;
888 data = (presets_data_t*)link->data;
889 if (strcmp(name, data->name) == 0)
894 ret = (data->custom ? PRESET_CUSTOM : 0);
895 ret |= (data->defalt ? PRESET_DEFAULT : 0);
898 link = g_list_next(link);
906 ghb_presets_get_names()
909 GList *link = presetsList;
912 g_debug("ghb_presets_get_names()\n");
913 result = g_malloc((g_list_length(presetsList)+1) * sizeof(gchar*));
916 presets_data_t *data;
917 data = (presets_data_t*)link->data;
918 result[ii++] = g_strdup(data->name);
919 link = g_list_next(link);
926 ghb_presets_get_descriptions()
929 GList *link = presetsList;
932 g_debug("ghb_presets_get_names()\n");
933 result = g_malloc((g_list_length(presetsList)+1) * sizeof(gchar*));
936 presets_data_t *data;
937 data = (presets_data_t*)link->data;
938 result[ii++] = g_strdup(data->description);
939 link = g_list_next(link);
946 ghb_presets_get_name(gint index)
948 gchar *result = NULL;
949 GList *link = presetsList;
952 g_debug("ghb_presets_get_name()\n");
953 while ((link != NULL) && (ii < index))
955 link = g_list_next(link);
960 presets_data_t *data;
961 data = (presets_data_t*)link->data;
968 init_presets_hash_from_key_file(signal_user_data_t *ud, const gchar *name, GKeyFile *keyFile)
974 // Get key list from internal default presets. This way we do not
975 // load any unknown keys.
976 keys = g_key_file_get_keys(internalKeyFile, "Presets", &length, NULL);
980 for (ii = 0; keys[ii] != NULL; ii++)
982 g_debug("key (%s)\n", keys[ii]);
984 if (name != NULL && keyFile != NULL)
986 str = g_key_file_get_string(keyFile, name, keys[ii], NULL);
987 g_debug("(%s, %s)\n", keys[ii], str);
991 str = g_key_file_get_string(internalKeyFile, "Presets", keys[ii], NULL);
995 g_debug("name (%s): key (%s) -- str (%s)\n", name, keys[ii], str);
996 ghb_settings_set_string(ud->settings, keys[ii], str);
997 ghb_ui_update(ud, keys[ii], str);
1008 preset_to_ui(signal_user_data_t *ud, presets_data_t *data)
1010 g_debug("preset_to_settings()\n");
1011 // Initialize the ui from presets file.
1015 init_presets_hash_from_key_file(ud, NULL, NULL);
1020 g_debug("preset name (%s)\n", data->name);
1021 // Initialize from preset
1022 init_presets_hash_from_key_file(ud, data->name, data->keyFile);
1027 preset_update_ui(signal_user_data_t *ud, presets_data_t *data, const gchar *key)
1031 g_debug("preset_update_settings()\n");
1032 // Initialize the ui from presets file.
1033 if (data == NULL) return;
1034 str = g_key_file_get_string(data->keyFile, data->name, key, NULL);
1037 ghb_ui_update(ud, key, str);
1043 ghb_set_preset(signal_user_data_t *ud, const gchar *name)
1045 presets_data_t *data;
1047 g_debug("ghb_update_from_preset() %s\n", name);
1050 name = ghb_presets_get_name(0);
1054 preset_to_ui(ud, NULL);
1058 data = presets_list_search(presetsList, name);
1059 preset_to_ui(ud, data);
1060 ghb_settings_set_string(ud->settings, "preset", name);
1065 ghb_update_from_preset(
1066 signal_user_data_t *ud,
1070 presets_data_t *data;
1072 g_debug("ghb_set_preset() %s\n", name);
1073 if (name == NULL) return;
1074 data = presets_list_search(presetsList, name);
1075 preset_update_ui(ud, data, key);
1079 build_presets_list(GHashTable *settings)
1081 GList *link = presetsList;
1082 presets_data_t *data;
1083 gchar **custom, **standard;
1084 gsize clength, slength;
1087 g_debug("build_presets_list ()\n");
1088 // First clear out the old presets list
1089 while (link != NULL)
1091 data = (presets_data_t*)link->data;
1093 if (data->description != NULL)
1094 g_free(data->description);
1096 link = g_list_delete_link (link, link);
1100 // Now build up the new list
1101 const gchar *def_name = ghb_settings_get_string(settings, "default_preset");
1102 custom = g_key_file_get_groups(customKeyFile, &clength);
1103 standard = g_key_file_get_groups(standardKeyFile, &slength);
1104 if ((slength + clength) <= 0) return;
1106 for (ii = 0; ii < slength; ii++)
1108 if (search_group(standard[ii], custom) < 0)
1111 data = g_malloc(sizeof(presets_data_t));
1112 data->name = g_strdup(standard[ii]);
1113 data->keyFile = standardKeyFile;
1114 data->custom = FALSE;
1115 data->defalt = FALSE;
1116 if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
1118 data->defalt = TRUE;
1120 desc = g_key_file_get_string(standardKeyFile, standard[ii], "preset_description", NULL);
1121 data->description = desc;
1122 presetsList = g_list_append(presetsList, data);
1125 for (ii = 0; ii < clength; ii++)
1128 data = g_malloc(sizeof(presets_data_t));
1129 data->name = g_strdup(custom[ii]);
1130 data->keyFile = customKeyFile;
1131 data->custom = TRUE;
1132 data->defalt = FALSE;
1133 if ((def_name != NULL) && (strcmp(def_name, data->name) == 0))
1135 data->defalt = TRUE;
1137 desc = g_key_file_get_string(customKeyFile, custom[ii], "preset_description", NULL);
1138 data->description = desc;
1139 presetsList = g_list_append(presetsList, data);
1142 g_strfreev(standard);
1146 store_key_file(GKeyFile *key_file, const gchar *name)
1148 gchar *settingsString;
1154 g_debug("store_key_file ()\n");
1155 settingsString = g_key_file_to_data(key_file, &length, NULL);
1157 dir = g_get_user_config_dir();
1158 config = g_strdup_printf ("%s/ghb", dir);
1159 if (!g_file_test(config, G_FILE_TEST_IS_DIR))
1161 g_mkdir (config, 0755);
1164 config = g_strdup_printf ("%s/ghb/%s", dir, name);
1165 fd = g_open(config, O_RDWR|O_CREAT|O_TRUNC, 0777);
1166 write(fd, settingsString, length);
1168 g_debug("prefs:\n%s\n", settingsString);
1169 g_free(settingsString);
1173 ghb_prefs_to_ui(signal_user_data_t *ud)
1177 str = ghb_settings_get_string(ud->settings, "default_source");
1178 ghb_settings_set_string (ud->settings, "source", str);
1179 str = ghb_settings_get_string(ud->settings, "destination_dir");
1181 gchar *path = g_strdup_printf ("%s/new_video.mp4", str);
1182 ghb_ui_update(ud, "destination", path);
1186 static gboolean prefs_initializing = FALSE;
1189 ghb_prefs_save(GHashTable *settings)
1196 if (prefs_initializing) return;
1197 keys = g_key_file_get_keys(internalKeyFile, "Preferences", &length, NULL);
1200 for (ii = 0; keys[ii] != NULL; ii++)
1202 value = ghb_settings_get_string(settings, keys[ii]);
1205 g_key_file_set_value(prefsKeyFile, "Preferences", keys[ii], value);
1209 store_key_file(prefsKeyFile, "preferences");
1214 ghb_pref_save(GHashTable *settings, const gchar *key)
1218 if (prefs_initializing) return;
1219 value = ghb_settings_get_string(settings, key);
1222 g_key_file_set_value(prefsKeyFile, "Preferences", key, value);
1223 store_key_file(prefsKeyFile, "preferences");
1229 dump_key_file(GKeyFile *keyFile, const gchar *section)
1235 // Get defaults from internal defaults
1236 keys = g_key_file_get_keys(keyFile, section, &length, NULL);
1239 for (ii = 0; keys[ii] != NULL; ii++)
1243 str = g_key_file_get_string(keyFile, section, keys[ii], NULL);
1246 g_message("Preference: key (%s) -- str (%s)\n", keys[ii], str);
1251 g_message("Preference: key (%s) -- str **none**\n", keys[ii]);
1258 g_message("no keys");
1264 ghb_prefs_load(signal_user_data_t *ud)
1274 prefs_initializing = TRUE;
1275 internalKeyFile = g_key_file_new();
1276 res = g_key_file_load_from_data( internalKeyFile, defaultSettings,
1277 sizeof(defaultSettings), G_KEY_FILE_NONE, NULL);
1279 g_warning("Failed to initialize internal defaults\n");
1281 keys = g_key_file_get_keys(internalKeyFile, "Initialization", &length, NULL);
1285 for (ii = 0; keys[ii] != NULL; ii++)
1289 g_debug("key (%s)\n", keys[ii]);
1290 str = g_key_file_get_string(internalKeyFile, "Initialization", keys[ii], NULL);
1293 g_debug("Initialization: key (%s) -- str (%s)\n", keys[ii], str);
1294 ghb_settings_set_string(ud->settings, keys[ii], str);
1295 ghb_ui_update(ud, keys[ii], str);
1301 prefsKeyFile = g_key_file_new();
1302 dir = g_get_user_config_dir();
1303 config = g_strdup_printf ("%s/ghb/preferences", dir);
1304 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1306 g_key_file_load_from_file( prefsKeyFile, config, G_KEY_FILE_KEEP_COMMENTS, NULL);
1308 value = g_key_file_get_value(prefsKeyFile, "Preferences", "version", NULL);
1313 // Get defaults from internal defaults
1314 keys = g_key_file_get_keys(internalKeyFile, "Preferences", &length, NULL);
1317 for (ii = 0; keys[ii] != NULL; ii++)
1321 str = g_key_file_get_string(internalKeyFile, "Preferences", keys[ii], NULL);
1324 g_debug("Preference: key (%s) -- str (%s)\n", keys[ii], str);
1325 g_key_file_set_value(prefsKeyFile, "Preferences", keys[ii], str);
1331 const gchar *dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS);
1332 g_key_file_set_value(prefsKeyFile, "Preferences", "destination_dir", dir);
1333 store_key_file(prefsKeyFile, "preferences");
1336 keys = g_key_file_get_keys(internalKeyFile, "Preferences", &length, NULL);
1339 for (ii = 0; keys[ii] != NULL; ii++)
1341 value = g_key_file_get_value(prefsKeyFile, "Preferences", keys[ii], NULL);
1344 ghb_settings_set_string(ud->settings, keys[ii], value);
1345 ghb_ui_update(ud, keys[ii], value);
1350 value = g_key_file_get_value(internalKeyFile, "Preferences", keys[ii], NULL);
1353 ghb_settings_set_string(ud->settings, keys[ii], value);
1354 ghb_ui_update(ud, keys[ii], value);
1361 gint bval = ghb_settings_get_int(ud->settings, "show_presets");
1362 ghb_ui_update_int(ud, "show_presets", bval);
1363 if (ghb_settings_get_bool(ud->settings, "hbfd_feature"))
1366 bval = ghb_settings_get_int(ud->settings, "hbfd");
1367 ghb_ui_update_int(ud, "hbfd", bval);
1368 action = GHB_ACTION (ud->builder, "hbfd");
1369 gtk_action_set_visible(action, TRUE);
1373 ghb_ui_update_int(ud, "hbfd", 0);
1375 prefs_initializing = FALSE;
1379 ghb_presets_load(signal_user_data_t *ud)
1383 GHashTable *settings = ud->settings;
1385 g_debug("ghb_presets_load()\n");
1386 customKeyFile = g_key_file_new();
1387 standardKeyFile = g_key_file_new();
1388 dir = g_get_user_config_dir();
1389 config = g_strdup_printf ("%s/ghb/custom_presets", dir);
1390 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1392 g_key_file_load_from_file( customKeyFile, config,
1393 G_KEY_FILE_KEEP_COMMENTS, NULL);
1396 // Try current dir first. Makes testing prior to installation easier
1397 if (g_file_test("./standard_presets", G_FILE_TEST_IS_REGULAR))
1399 g_key_file_load_from_file( standardKeyFile, "./standard_presets",
1400 G_KEY_FILE_KEEP_COMMENTS, NULL);
1404 // Try users config dir
1405 config = g_strdup_printf ("%s/ghb/standard_presets", dir);
1406 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1408 g_key_file_load_from_file( standardKeyFile, config,
1409 G_KEY_FILE_KEEP_COMMENTS, NULL);
1414 const gchar* const *dirs;
1417 dirs = g_get_system_data_dirs();
1420 for (ii = 0; dirs[ii] != NULL; ii++)
1422 config = g_strdup_printf("%s/ghb/standard_presets", dirs[ii]);
1423 if (g_file_test(config, G_FILE_TEST_IS_REGULAR))
1425 g_key_file_load_from_file( standardKeyFile, config,
1426 G_KEY_FILE_KEEP_COMMENTS, NULL);
1434 build_presets_list(settings);
1440 g_debug("presets_store ()\n");
1441 store_key_file(customKeyFile, "custom_presets");
1452 store_to_key_file(gpointer xkey, gpointer xvalue, gpointer xski)
1454 store_key_info_t *ski = (store_key_info_t*)xski;
1455 setting_value_t *value = (setting_value_t *)xvalue;
1456 gchar *key = (gchar*)xkey;
1459 if (!ski->autoscale)
1461 if (strcmp(key, "scale_width"))
1465 if (strcmp(key, "scale_height"))
1470 str = g_key_file_get_string(internalKeyFile, "Presets", key, NULL);
1473 g_debug("Setting (%s) is not in defaults\n", (gchar*)key);
1476 g_debug("comparing: key (%s) -- (%s) == (%s)\n", (gchar*)key, str, value->svalue);
1477 if (strcmp(str, value->shortOpt) != 0)
1479 // Differs from default value. Store it.
1480 g_debug("storing: key (%s) -- (%s)\n", (gchar*)key, value->shortOpt);
1481 gchar *tmp = g_strescape (value->shortOpt, NULL);
1482 g_key_file_set_value(ski->keyFile, ski->name, (gchar*)key, tmp);
1487 // Remove it if it exists already in keyfile
1488 g_key_file_remove_key (ski->keyFile, ski->name, (gchar*)key, NULL);
1494 ghb_settings_save(signal_user_data_t *ud, const gchar *name)
1496 store_key_info_t ski;
1498 g_debug("ghb_settings_save ()\n");
1500 ski.keyFile = customKeyFile;
1501 ski.autoscale = ghb_settings_get_bool (ud->settings, "autoscale");
1502 g_hash_table_foreach(ud->settings, store_to_key_file, &ski);
1504 build_presets_list(ud->settings);
1505 ud->dont_clear_presets = TRUE;
1506 ghb_set_preset (ud, name);
1507 ud->dont_clear_presets = FALSE;
1510 // Checks to see if the preset is in standard presets
1511 // I allow standard to be overridden by adding a preset with the
1512 // same name to the custom list. So to determine if the named
1513 // preset is standard, I must first check to see if is in the
1516 ghb_presets_is_standard(const gchar *name)
1518 g_debug("ghb_presets_is_standard()\n");
1519 if (g_key_file_has_group(customKeyFile, name))
1521 // The preset is in the custom list, so it
1522 // can not be a standard.
1525 return g_key_file_has_group(standardKeyFile, name);
1528 // This function will not remove presets from the standard preset list.
1529 // Return false if attempt is made.
1531 ghb_presets_remove(GHashTable *settings, const gchar *name)
1533 g_debug("ghb_presets_remove()\n");
1534 if (g_key_file_has_group(customKeyFile, name))
1536 g_debug("\t removing %s\n", name);
1537 g_key_file_remove_group(customKeyFile, name, NULL);
1539 build_presets_list(settings);