--- ./geany.glade.orig 2010-10-03 18:24:47.000000000 +0300
+++ ./geany.glade 2010-10-29 20:45:53.000000000 +0300
@@ -9761,6 +9761,272 @@
tab
+
+
+
+ 5
+ True
+ 0
+ 0.5
+ GTK_SHADOW_NONE
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 12
+ 0
+
+
+
+ True
+ False
+ 5
+
+
+
+ True
+ False
+ 0
+
+
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ True
+ GTK_POLICY_ALWAYS
+ GTK_POLICY_ALWAYS
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ True
+ True
+ False
+ True
+ False
+ False
+ False
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ 0
+ 0.5
+ 1
+ 1
+ 0
+ 5
+ 0
+ 0
+
+
+
+ True
+ False
+ 5
+
+
+
+ True
+ False
+ 5
+
+
+
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ True
+ _Reset
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ 0
+ 0.5
+ 1
+ 1
+ 0
+ 5
+ 0
+ 0
+
+
+
+ True
+ False
+ 5
+
+
+
+ True
+ <i>You need to restart Geany for these preferences to take effect</i>.
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+ True
+ <b>Various preferences</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ label_item
+
+
+
+
+ False
+ True
+
+
+
+
+
+ True
+ Various
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+ PANGO_ELLIPSIZE_NONE
+ -1
+ False
+ 0
+
+
+ tab
+
+
6
--- ./src/build.c.orig 2010-10-03 18:24:42.000000000 +0300
+++ ./src/build.c 2010-10-26 19:39:23.000000000 +0300
@@ -70,6 +70,8 @@
GeanyBuildInfo build_info = {GEANY_GBG_FT, 0, 0, NULL, GEANY_FILETYPES_NONE, NULL, 0};
+GeanyBuildMenuPrefs build_menu_prefs;
+
static gchar *current_dir_entered = NULL;
typedef struct RunInfo
--- ./src/build.h.orig 2010-10-03 18:24:42.000000000 +0300
+++ ./src/build.h 2010-10-26 19:39:23.000000000 +0300
@@ -158,6 +158,15 @@
/* opaque pointers returned from build functions and passed back to them */
typedef struct BuildTableFields *BuildTableData;
+typedef struct GeanyBuildMenuPrefs
+{
+ int number_ft_menu_items;
+ int number_non_ft_menu_items;
+ int number_exec_menu_items;
+} GeanyBuildMenuPrefs;
+
+extern GeanyBuildMenuPrefs build_menu_prefs;
+
void build_init(void);
void build_finalize(void);
--- ./src/interface.c.orig 2010-10-03 18:24:42.000000000 +0300
+++ ./src/interface.c 2010-10-29 20:45:53.000000000 +0300
@@ -2779,6 +2779,22 @@
GtkWidget *radio_print_gtk;
GtkWidget *label243;
GtkWidget *label201;
+ GtkWidget *frame42;
+ GtkWidget *alignment52;
+ GtkWidget *vbox54;
+ GtkWidget *vbox55;
+ GtkWidget *scrolledwindow9;
+ GtkWidget *various_treeview;
+ GtkWidget *alignment53;
+ GtkWidget *hbox20;
+ GtkWidget *various_hbox;
+ GtkWidget *various_label;
+ GtkWidget *various_button;
+ GtkWidget *alignment54;
+ GtkWidget *hbox22;
+ GtkWidget *label250;
+ GtkWidget *label248;
+ GtkWidget *label247;
GtkWidget *dialog_action_area3;
GtkWidget *button3;
GtkWidget *button4;
@@ -4841,6 +4857,79 @@
gtk_widget_show (label201);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook2), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook2), 8), label201);
+ frame42 = gtk_frame_new (NULL);
+ gtk_widget_show (frame42);
+ gtk_container_add (GTK_CONTAINER (notebook2), frame42);
+ gtk_container_set_border_width (GTK_CONTAINER (frame42), 5);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame42), GTK_SHADOW_NONE);
+
+ alignment52 = gtk_alignment_new (0.5, 0.5, 1, 1);
+ gtk_widget_show (alignment52);
+ gtk_container_add (GTK_CONTAINER (frame42), alignment52);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (alignment52), 0, 0, 12, 0);
+
+ vbox54 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox54);
+ gtk_container_add (GTK_CONTAINER (alignment52), vbox54);
+
+ vbox55 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox55);
+ gtk_box_pack_start (GTK_BOX (vbox54), vbox55, FALSE, TRUE, 0);
+
+ scrolledwindow9 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolledwindow9);
+ gtk_box_pack_start (GTK_BOX (vbox54), scrolledwindow9, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow9), GTK_SHADOW_IN);
+
+ various_treeview = gtk_tree_view_new ();
+ gtk_widget_show (various_treeview);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow9), various_treeview);
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (various_treeview), TRUE);
+
+ alignment53 = gtk_alignment_new (0, 0.5, 1, 1);
+ gtk_widget_show (alignment53);
+ gtk_box_pack_start (GTK_BOX (vbox54), alignment53, FALSE, FALSE, 0);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (alignment53), 0, 5, 0, 0);
+
+ hbox20 = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox20);
+ gtk_container_add (GTK_CONTAINER (alignment53), hbox20);
+
+ various_hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (various_hbox);
+ gtk_box_pack_start (GTK_BOX (hbox20), various_hbox, TRUE, TRUE, 0);
+
+ various_label = gtk_label_new ("");
+ gtk_widget_show (various_label);
+ gtk_box_pack_start (GTK_BOX (various_hbox), various_label, FALSE, FALSE, 0);
+
+ various_button = gtk_button_new_with_mnemonic (_("_Reset"));
+ gtk_widget_show (various_button);
+ gtk_box_pack_start (GTK_BOX (hbox20), various_button, FALSE, FALSE, 0);
+
+ alignment54 = gtk_alignment_new (0, 0.5, 1, 1);
+ gtk_widget_show (alignment54);
+ gtk_box_pack_start (GTK_BOX (vbox54), alignment54, FALSE, FALSE, 0);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (alignment54), 0, 5, 0, 0);
+
+ hbox22 = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox22);
+ gtk_container_add (GTK_CONTAINER (alignment54), hbox22);
+
+ label250 = gtk_label_new (_("You need to restart Geany for these preferences to take effect."));
+ gtk_widget_show (label250);
+ gtk_box_pack_start (GTK_BOX (hbox22), label250, FALSE, FALSE, 0);
+ gtk_label_set_use_markup (GTK_LABEL (label250), TRUE);
+
+ label248 = gtk_label_new (_("Various preferences"));
+ gtk_widget_show (label248);
+ gtk_frame_set_label_widget (GTK_FRAME (frame42), label248);
+ gtk_label_set_use_markup (GTK_LABEL (label248), TRUE);
+
+ label247 = gtk_label_new (_("Various"));
+ gtk_widget_show (label247);
+ gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook2), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook2), 9), label247);
+
dialog_action_area3 = GTK_DIALOG (prefs_dialog)->action_area;
gtk_widget_show (dialog_action_area3);
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area3), GTK_BUTTONBOX_END);
@@ -5245,6 +5334,22 @@
GLADE_HOOKUP_OBJECT (prefs_dialog, radio_print_gtk, "radio_print_gtk");
GLADE_HOOKUP_OBJECT (prefs_dialog, label243, "label243");
GLADE_HOOKUP_OBJECT (prefs_dialog, label201, "label201");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, frame42, "frame42");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, alignment52, "alignment52");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, vbox54, "vbox54");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, vbox55, "vbox55");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, scrolledwindow9, "scrolledwindow9");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, various_treeview, "various_treeview");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, alignment53, "alignment53");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, hbox20, "hbox20");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, various_hbox, "various_hbox");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, various_label, "various_label");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, various_button, "various_button");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, alignment54, "alignment54");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, hbox22, "hbox22");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, label250, "label250");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, label248, "label248");
+ GLADE_HOOKUP_OBJECT (prefs_dialog, label247, "label247");
GLADE_HOOKUP_OBJECT_NO_REF (prefs_dialog, dialog_action_area3, "dialog_action_area3");
GLADE_HOOKUP_OBJECT (prefs_dialog, button3, "button3");
GLADE_HOOKUP_OBJECT (prefs_dialog, button4, "button4");
--- ./src/keyfile.c.orig 2010-10-22 20:50:53.000000000 +0300
+++ ./src/keyfile.c 2010-10-26 19:47:26.000000000 +0300
@@ -174,10 +174,10 @@
stash_group_add_spin_button_integer(group, &file_prefs.disk_check_timeout,
"disk_check_timeout", GEANY_DISK_CHECK_TIMEOUT, "spin_disk_check");
- /* hidden prefs (don't overwrite them so users can edit them manually) */
+ /* various geany prefs */
group = stash_group_new(PACKAGE);
- configuration_add_pref_group(group, FALSE);
- stash_group_set_write_once(group, TRUE);
+ configuration_add_pref_group(group, TRUE);
+ stash_group_set_various(group, TRUE);
stash_group_add_boolean(group, &editor_prefs.show_scrollbars,
"show_editor_scrollbars", TRUE);
@@ -195,7 +195,19 @@
stash_group_add_integer(group, (gint*)&search_prefs.find_selection_type,
"find_selection_type", GEANY_FIND_SEL_CURRENT_WORD);
- /* Note: Interface-related hidden prefs are in ui_init_prefs() */
+ /* Note: Interface-related variuos prefs are in ui_init_prefs() */
+
+ /* variuos build-menu prefs */
+ group = stash_group_new("build-menu");
+ configuration_add_pref_group(group, TRUE);
+ stash_group_set_various(group, TRUE);
+
+ stash_group_add_integer(group, &build_menu_prefs.number_ft_menu_items,
+ "number_ft_menu_items", 0);
+ stash_group_add_integer(group, &build_menu_prefs.number_non_ft_menu_items,
+ "number_non_ft_menu_items", 0);
+ stash_group_add_integer(group, &build_menu_prefs.number_exec_menu_items,
+ "number_exec_menu_items", 0);
}
@@ -361,10 +373,6 @@
g_key_file_set_boolean(config, PACKAGE, "tab_order_beside", file_prefs.tab_order_beside);
g_key_file_set_integer(config, PACKAGE, "tab_pos_editor", interface_prefs.tab_pos_editor);
g_key_file_set_integer(config, PACKAGE, "tab_pos_msgwin", interface_prefs.tab_pos_msgwin);
- g_key_file_set_boolean(config, PACKAGE, "msgwin_status_visible", interface_prefs.msgwin_status_visible);
- g_key_file_set_boolean(config, PACKAGE, "msgwin_compiler_visible", interface_prefs.msgwin_compiler_visible);
- g_key_file_set_boolean(config, PACKAGE, "msgwin_messages_visible", interface_prefs.msgwin_messages_visible);
- g_key_file_set_boolean(config, PACKAGE, "msgwin_scribble_visible", interface_prefs.msgwin_scribble_visible);
g_key_file_set_boolean(config, PACKAGE, "use_native_windows_dialogs", interface_prefs.use_native_windows_dialogs);
/* display */
@@ -655,10 +663,6 @@
interface_prefs.editor_font = utils_get_setting_string(config, PACKAGE, "editor_font", GEANY_DEFAULT_FONT_EDITOR);
interface_prefs.tagbar_font = utils_get_setting_string(config, PACKAGE, "tagbar_font", GEANY_DEFAULT_FONT_SYMBOL_LIST);
interface_prefs.msgwin_font = utils_get_setting_string(config, PACKAGE, "msgwin_font", GEANY_DEFAULT_FONT_MSG_WINDOW);
- interface_prefs.msgwin_status_visible = utils_get_setting_boolean(config, PACKAGE, "msgwin_status_visible", TRUE);
- interface_prefs.msgwin_compiler_visible = utils_get_setting_boolean(config, PACKAGE, "msgwin_compiler_visible", TRUE);
- interface_prefs.msgwin_messages_visible = utils_get_setting_boolean(config, PACKAGE, "msgwin_messages_visible", TRUE);
- interface_prefs.msgwin_scribble_visible = utils_get_setting_boolean(config, PACKAGE, "msgwin_scribble_visible", TRUE);
interface_prefs.use_native_windows_dialogs = utils_get_setting_boolean(config, PACKAGE, "use_native_windows_dialogs", FALSE);
/* display, editor */
@@ -806,9 +810,9 @@
tool_prefs.context_action_cmd = utils_get_setting_string(config, PACKAGE, "context_action_cmd", "");
/* build menu */
- build_set_group_count(GEANY_GBG_FT, utils_get_setting_integer(config, "build-menu", "number_ft_menu_items", 0));
- build_set_group_count(GEANY_GBG_NON_FT, utils_get_setting_integer(config, "build-menu", "number_non_ft_menu_items", 0));
- build_set_group_count(GEANY_GBG_EXEC, utils_get_setting_integer(config, "build-menu", "number_exec_menu_items", 0));
+ build_set_group_count(GEANY_GBG_FT, build_menu_prefs.number_ft_menu_items);
+ build_set_group_count(GEANY_GBG_NON_FT, build_menu_prefs.number_non_ft_menu_items);
+ build_set_group_count(GEANY_GBG_EXEC, build_menu_prefs.number_exec_menu_items);
build_load_menu(config, GEANY_BCS_PREF, NULL);
/* printing */
--- ./src/prefs.c.orig 2010-10-03 18:24:42.000000000 +0300
+++ ./src/prefs.c 2010-10-26 20:35:47.000000000 +0300
@@ -1657,6 +1657,15 @@
ui_entry_add_clear_icon(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, *name)));
}
+ /* page Various */
+ {
+ GtkTreeView *tree = GTK_TREE_VIEW(ui_lookup_widget(ui_widgets.prefs_dialog, "various_treeview"));
+ GtkLabel *label = GTK_LABEL(ui_lookup_widget(ui_widgets.prefs_dialog, "various_label"));
+ GtkBox *container = GTK_BOX(ui_lookup_widget(ui_widgets.prefs_dialog, "various_hbox"));
+ GtkButton *reset = GTK_BUTTON(ui_lookup_widget(ui_widgets.prefs_dialog, "various_button"));
+ stash_setup_editor(pref_groups, TRUE, ui_widgets.prefs_dialog, tree, label, container, reset);
+ }
+
#ifdef HAVE_VTE
vte_append_preferences_tab();
#endif
--- ./src/stash.c.orig 2010-10-09 16:10:14.000000000 +0300
+++ ./src/stash.c 2010-10-26 20:57:57.000000000 +0300
@@ -84,7 +84,9 @@
#include "geany.h" /* necessary for utils.h, otherwise use gtk/gtk.h */
-#include "utils.h" /* only for foreach_*, utils_get_setting_*(). Stash should not depend on Geany. */
+#include "support.h" /* only for _("text") */
+#include "utils.h" /* only for foreach_*, utils_get_setting_*() and
+ * ui_widget_set_tooltip_text(). Stash should not depend on Geany. */
#include "stash.h"
@@ -106,7 +108,7 @@
{
const gchar *name; /* group name to use in the keyfile */
GArray *entries; /* array of StashPref */
- gboolean write_once; /* only write settings if they don't already exist */
+ gboolean various; /* mark group for display/edit in stash treeview */
gboolean use_defaults; /* use default values if there's no keyfile entry */
};
@@ -224,21 +226,11 @@
foreach_array(StashPref, entry, group->entries)
{
- gpointer tmp = entry->setting;
-
/* don't override settings with default values */
if (!group->use_defaults && action == SETTING_READ &&
!g_key_file_has_key(keyfile, group->name, entry->key_name, NULL))
continue;
- /* don't overwrite write_once prefs */
- if (group->write_once && action == SETTING_WRITE)
- {
- if (g_key_file_has_key(keyfile, group->name, entry->key_name, NULL))
- continue;
- /* We temporarily use the default value for writing */
- entry->setting = &entry->default_value;
- }
switch (entry->setting_type)
{
case G_TYPE_BOOLEAN:
@@ -255,8 +247,6 @@
g_warning("Unhandled type for %s::%s in %s()!", group->name, entry->key_name,
G_STRFUNC);
}
- if (group->write_once && action == SETTING_WRITE)
- entry->setting = tmp;
}
}
@@ -372,9 +362,9 @@
/* Useful so the user can edit the keyfile manually while the program is running,
* and the setting won't be overridden.
* @c FALSE by default. */
-void stash_group_set_write_once(StashGroup *group, gboolean write_once)
+void stash_group_set_various(StashGroup *group, gboolean various)
{
- group->write_once = write_once;
+ group->various = various;
}
@@ -903,3 +893,363 @@
}
+enum
+{
+ STASH_TREE_NAME,
+ STASH_TREE_VALUE,
+ STASH_TREE_PREF,
+ STASH_TREE_COUNT
+};
+
+
+static void stash_tree_update_value(const gchar *value, gpointer user_data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(user_data), &model, &iter))
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter, STASH_TREE_VALUE, value, -1);
+}
+
+
+static void stash_check_button_toggled_cb(GtkToggleButton *button, gpointer user_data)
+{
+ stash_tree_update_value(gtk_toggle_button_get_active(button) ? "true" : "false", user_data);
+}
+
+
+static void stash_int_entry_changed_cb(GtkEditable *editable, gpointer user_data)
+{
+ const gchar *value = gtk_entry_get_text(GTK_ENTRY(editable));
+ stash_tree_update_value(*value ? value : "0", user_data);
+}
+
+
+static void stash_string_entry_changed_cb(GtkEditable *editable, gpointer user_data)
+{
+ stash_tree_update_value(gtk_entry_get_text(GTK_ENTRY(editable)), user_data);
+}
+
+
+static gchar *stash_tree_pref_to_string(StashPref *entry, gboolean current)
+{
+ gpointer *setting = current ? entry->setting : &entry->default_value;
+ gchar *value;
+
+ switch (entry->setting_type)
+ {
+ case G_TYPE_BOOLEAN:
+ value = g_strdup(*(gboolean *) setting ? "true" : "false"); break;
+ case G_TYPE_INT:
+ value = g_strdup_printf("%d", *(gint *) setting); break;
+ case G_TYPE_STRING:
+ value = g_strdup(*(gchararray *) setting); break;
+ default:
+ g_warning("Unhandled type for %s in %s()!", entry->key_name, G_STRFUNC);
+ value = NULL;
+ }
+
+ return value;
+}
+
+
+typedef struct
+{
+ GtkWidget *owner;
+ GtkTreeView *tree; /* currently not used */
+ GtkTreeSelection *selection;
+ GtkLabel *label;
+ GtkBox *container;
+ GtkButton *reset;
+ StashPref *entry;
+} StashEditorData;
+
+
+static void stash_tree_selection_changed_cb(GtkTreeSelection *selection, gpointer user_data)
+{
+ StashEditorData *sed = (StashEditorData *) user_data;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ StashPref *new_entry = NULL;
+
+ if (gtk_tree_selection_get_selected(sed->selection, &model, &iter))
+ gtk_tree_model_get(model, &iter, STASH_TREE_PREF, &new_entry, -1);
+ else
+ new_entry = NULL;
+
+ if (new_entry != sed->entry)
+ {
+ if (sed->label)
+ {
+ if (new_entry)
+ {
+ gchar *name;
+ gchar *label;
+
+ gtk_tree_model_get(model, &iter, STASH_TREE_NAME, &name, -1);
+ label = g_strdup_printf("%s:", name);
+ gtk_label_set_text(sed->label, label);
+ g_free(label);
+ g_free(name);
+ }
+ else
+ gtk_label_set_text(sed->label, "");
+ }
+
+ if (sed->container)
+ {
+ GtkWidget *new_widget;
+
+ if (sed->entry)
+ {
+ GtkWidget *old_widget = get_widget(sed->owner, sed->entry->widget_id);
+
+ if (old_widget)
+ gtk_widget_hide(old_widget);
+ }
+
+ if (new_entry)
+ {
+ new_widget = get_widget(sed->owner, new_entry->widget_id);
+ if (new_widget)
+ gtk_widget_show(new_widget);
+ }
+ else
+ new_widget = NULL;
+
+ if (sed->reset)
+ {
+ if (new_widget)
+ {
+ gchar *value = stash_tree_pref_to_string(new_entry, FALSE);
+ gchar *tooltip = g_strdup_printf("Default = %s", value);
+
+ if (!sed->entry)
+ gtk_widget_set_sensitive(GTK_WIDGET(sed->reset), TRUE);
+ ui_widget_set_tooltip_text(sed->reset, tooltip);
+ g_free(tooltip);
+ g_free(value);
+ }
+ else
+ gtk_widget_set_sensitive(GTK_WIDGET(sed->reset), FALSE);
+ }
+ }
+
+ sed->entry = new_entry;
+ }
+}
+
+
+/* only PREF_DISPLAY is used, update is automatic */
+static void handle_editor_widget(GtkWidget *widget, StashPref *entry, PrefAction action)
+{
+ switch (entry->setting_type)
+ {
+ case G_TYPE_BOOLEAN:
+ handle_toggle_button(widget, entry->setting, action);
+ break;
+ case G_TYPE_INT:
+ handle_spin_button(widget, entry, action);
+ break;
+ case G_TYPE_STRING:
+ handle_entry(widget, entry, action);
+ break;
+ default:
+ g_warning("Unhandled type for %s in %s()!", entry->key_name, G_STRFUNC);
+ }
+}
+
+
+static void stash_reset_button_clicked_cb(GtkButton *button, gpointer user_data)
+{
+ StashEditorData *sed = (StashEditorData *) user_data;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected(sed->selection, &model, &iter))
+ {
+ StashPref *entry;
+ GtkWidget *widget;
+
+ gtk_tree_model_get(model, &iter, STASH_TREE_PREF, &entry, -1);
+ widget = get_widget(sed->owner, entry->widget_id);
+ if (widget)
+ {
+ gpointer tmp = entry->setting;
+
+ entry->setting = &entry->default_value;
+ handle_editor_widget(widget, entry, PREF_DISPLAY);
+ entry->setting = tmp;
+ }
+ }
+}
+
+
+static gboolean stash_tree_free_widget_id(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer user_data)
+{
+ StashPref *entry;
+
+ gtk_tree_model_get(model, iter, STASH_TREE_PREF, &entry, -1);
+ g_free(entry->widget_id);
+ entry->widget_id = NULL;
+
+ return FALSE;
+}
+
+
+static void stash_tree_destroy_cb(GtkWidget *widget, gpointer user_data)
+{
+ GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+ gtk_tree_model_foreach(model, stash_tree_free_widget_id, NULL);
+}
+
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+ g_object_set_data_full (G_OBJECT (component), name, \
+ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+
+
+/** Setups a simple editor for stash preferences based on the widget arguments.
+ * @param group_array Array of groups which's settings will be edited.
+ * @param various_only If TRUE, only groups with the various flag set will be edited.
+ * @param owner GtkWidget that owns the editor widgets.
+ * @param tree GtkTreeView in which to display the preferences.
+ * Must not contain any other items.
+ * @param label GtkLabel in which the the name of the current item will be displayed.
+ * May be NULL.
+ * @param container GtkBox that will contain a widget for editing of the current item.
+ * If NULL, the preferences will be displayed only, not edited.
+ * @param reset GtkButton that, when pressed, will reset the current item to it's default value.
+ * May be NULL. Requires non-NULL @param container to work. */
+void stash_setup_editor(GPtrArray *group_array, gboolean various_only,
+ GtkWidget *owner, GtkTreeView *tree, GtkLabel *label,
+ GtkBox *container, GtkButton *reset)
+{
+ StashGroup *group;
+ guint i;
+ GtkListStore *store;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(tree);
+
+ store = gtk_list_store_new(STASH_TREE_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ foreach_ptr_array(group, i, group_array)
+ {
+ StashPref *entry;
+
+ if (various_only && !group->various)
+ continue;
+
+ foreach_array(StashPref, entry, group->entries)
+ {
+ GtkTreeIter iter;
+ gchar *value = stash_tree_pref_to_string(entry, TRUE);
+ GtkWidget *widget;
+ gboolean sizable;
+ const gchar *signame;
+ GCallback sigfunc;
+
+ if (!value)
+ continue; /* entry not supported */
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter, STASH_TREE_NAME, entry->key_name,
+ STASH_TREE_VALUE, value, STASH_TREE_PREF, (gpointer) entry, -1);
+ g_free(value);
+
+ if (!container)
+ continue; /* display only, not edit */
+
+ switch (entry->setting_type)
+ {
+ case G_TYPE_BOOLEAN:
+ {
+ entry->widget_type = GTK_TYPE_TOGGLE_BUTTON;
+ widget = gtk_check_button_new();
+ sizable = FALSE;
+ signame = "toggled";
+ sigfunc = G_CALLBACK(stash_check_button_toggled_cb);
+ break;
+ }
+ case G_TYPE_INT:
+ {
+ entry->widget_type = GTK_TYPE_SPIN_BUTTON;
+ widget = gtk_spin_button_new_with_range(INT_MIN, INT_MAX, 1);
+ gtk_entry_set_max_length(GTK_ENTRY(widget), 20);
+ sizable = FALSE;
+ signame = "changed";
+ sigfunc = G_CALLBACK(stash_int_entry_changed_cb);
+ break;
+ }
+ case G_TYPE_STRING:
+ {
+ entry->widget_type = GTK_TYPE_ENTRY;
+ widget = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(widget), 255);
+ sizable = TRUE;
+ signame = "changed";
+ sigfunc = G_CALLBACK(stash_string_entry_changed_cb);
+ break;
+ }
+ default:
+ g_warning("Unhandled type for %s::%s in %s()!", group->name,
+ entry->key_name, G_STRFUNC);
+ widget = NULL;
+ }
+
+ /* widget_id is mandatory for entries added to the store */
+ entry->widget_id = g_strdup_printf("%s::%s", group->name, entry->key_name);
+ if (widget)
+ {
+ handle_editor_widget(widget, entry, PREF_DISPLAY);
+ g_signal_connect(widget, signame, sigfunc, selection);
+ gtk_box_pack_start(container, widget, sizable, sizable, 0);
+ GLADE_HOOKUP_OBJECT(owner, widget, entry->widget_id);
+ }
+ }
+ }
+ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), STASH_TREE_NAME,
+ GTK_SORT_ASCENDING);
+ gtk_tree_view_set_model(tree, GTK_TREE_MODEL(store));
+ g_object_unref(G_OBJECT(store));
+ g_signal_connect(tree, "destroy", G_CALLBACK(stash_tree_destroy_cb), NULL);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "text",
+ STASH_TREE_NAME, NULL);
+ gtk_tree_view_column_set_sort_column_id(column, STASH_TREE_NAME);
+ gtk_tree_view_column_set_sort_indicator(column, TRUE);
+ gtk_tree_view_append_column(tree, column);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Value"), renderer, "text",
+ STASH_TREE_VALUE, NULL);
+ gtk_tree_view_append_column(tree, column);
+
+ {
+ /* sed should only be visible to the callbacks */
+ static StashEditorData sed;
+
+ sed.owner = owner;
+ sed.tree = tree;
+ sed.selection = selection;
+ sed.label = label;
+ sed.container = container;
+ sed.reset = reset;
+ sed.entry = NULL;
+
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+ g_signal_connect(G_OBJECT(selection), "changed",
+ G_CALLBACK(stash_tree_selection_changed_cb), &sed);
+
+ if (reset)
+ {
+ gtk_widget_set_sensitive(GTK_WIDGET(reset), FALSE);
+ g_signal_connect(G_OBJECT(reset), "clicked",
+ G_CALLBACK(stash_reset_button_clicked_cb), &sed);
+ }
+ }
+}
+
+
--- ./src/stash.h.orig 2010-06-19 20:18:49.000000000 +0300
+++ ./src/stash.h 2010-10-26 18:44:31.000000000 +0300
@@ -92,4 +92,8 @@
void stash_group_update(StashGroup *group, GtkWidget *owner);
+void stash_setup_editor(GPtrArray *group_array, gboolean various_only,
+ GtkWidget *owner, GtkTreeView *tree, GtkLabel *label,
+ GtkBox *container, GtkButton *reset);
+
#endif
--- ./src/ui_utils.c.orig 2010-10-22 20:50:42.000000000 +0300
+++ ./src/ui_utils.c 2010-10-26 19:28:37.000000000 +0300
@@ -170,11 +170,7 @@
const gchar *expos; /* % expansion position */
const gchar sp[] = " ";
- fmt = NZV(statusbar_template) ? statusbar_template :
- /* Status bar statistics: col = column, sel = selection. */
- _("line: %l / %L\t col: %c\t sel: %s\t %w %t %m"
- "mode: %M encoding: %e filetype: %f scope: %S");
-
+ fmt = statusbar_template;
g_string_assign(stats_str, "");
while ((expos = strchr(fmt, '%')) != NULL)
{
@@ -2030,9 +2026,9 @@
{
StashGroup *group = stash_group_new(PACKAGE);
- /* hidden prefs (don't overwrite them so users can edit them manually) */
- configuration_add_pref_group(group, FALSE);
- stash_group_set_write_once(group, TRUE);
+ /* various prefs */
+ configuration_add_pref_group(group, TRUE);
+ stash_group_set_various(group, TRUE);
stash_group_add_boolean(group, &interface_prefs.show_symbol_list_expanders,
"show_symbol_list_expanders", TRUE);
@@ -2041,9 +2037,19 @@
stash_group_add_boolean(group, &ui_prefs.allow_always_save,
"allow_always_save", FALSE);
stash_group_add_string(group, &statusbar_template,
- "statusbar_template", "");
+ "statusbar_template", /* Status bar statistics: col = column, sel = selection. */
+ _("line: %l / %L\t col: %c\t sel: %s\t %w %t %m"
+ "mode: %M encoding: %e filetype: %f scope: %S"));
stash_group_add_boolean(group, &ui_prefs.new_document_after_close,
"new_document_after_close", FALSE);
+ stash_group_add_boolean(group, &interface_prefs.msgwin_status_visible,
+ "msgwin_status_visible", TRUE);
+ stash_group_add_boolean(group, &interface_prefs.msgwin_compiler_visible,
+ "msgwin_compiler_visible", TRUE);
+ stash_group_add_boolean(group, &interface_prefs.msgwin_messages_visible,
+ "msgwin_messages_visible", TRUE);
+ stash_group_add_boolean(group, &interface_prefs.msgwin_scribble_visible,
+ "msgwin_scribble_visible", TRUE);
}