geany/src/prefs.c

1825 lines
70 KiB
C
Raw Normal View History

/*
* prefs.c - this file is part of Geany, a fast and lightweight IDE
*
2012-06-18 01:13:05 +02:00
* Copyright 2005-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* Copyright 2006-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
2012-08-24 19:25:57 +02:00
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
* @file prefs.h
* Preferences dialog.
*/
/*
* Preferences dialog support functions.
* New 'simple' prefs should use Stash code in keyfile.c - init_pref_groups().
*/
Include what you use This is a mega-commit - because most of it had to be done in one go otherwise some commits would fail to compile - that attempts to fix a few problems with Geany's includes as well as various other related cleanups. After this change it's easier to use includes and there's little worry about which order things are included in or who includes what. Overview of changes: * Include config.h at the start of each source file if HAVE_CONFIG_H is defined (and never in headers). * Go through each source file and make the includes section generally like this: - Always config.h first as above - Then if the file has a header with the same name, include that - Then include in alphabetical order each other internal/geany header. - Then include standard headers - Then include non-standard system headers - Then include GLib/GTK+ related stuff * Doing as above makes it easier to find implicit header include dependencies and it exposed quite a few weird problems with includes or forward declarations, fix those. * Make geany.h contain not much besides some defines. - Add a little header file "app.h" for GeanyApp and move it there - Move "app" global to new "app.h" file - Move "ignore_callback" global to "callbacks.h" - Move "geany_object" global to "geanyobject.h" * Add an include in "geany.h" for "app.h" since GeanyApp used to be defined there and some plugins included this header to access GeanyApp. * Include "gtkcompat.h" everywhere instead of gtk/gtk.h so that everywhere sees the same definitions (not a problem in practice AFAIK so this could be changed back if better that way. * Remove forward declarations from previous commits as some people apparently consider this bad style, despite that it reduces inter- header dependencies. TODO: * As always, to test on win32 * As always, to test with not Autotools * Test plugins better, both builtin and geany-plugins, likely API/ABI bump * Test with various defines/flags that may change what is included * win32.[ch] not really touched since I couldn't test
2014-05-18 17:31:51 -07:00
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "prefs.h"
Include what you use This is a mega-commit - because most of it had to be done in one go otherwise some commits would fail to compile - that attempts to fix a few problems with Geany's includes as well as various other related cleanups. After this change it's easier to use includes and there's little worry about which order things are included in or who includes what. Overview of changes: * Include config.h at the start of each source file if HAVE_CONFIG_H is defined (and never in headers). * Go through each source file and make the includes section generally like this: - Always config.h first as above - Then if the file has a header with the same name, include that - Then include in alphabetical order each other internal/geany header. - Then include standard headers - Then include non-standard system headers - Then include GLib/GTK+ related stuff * Doing as above makes it easier to find implicit header include dependencies and it exposed quite a few weird problems with includes or forward declarations, fix those. * Make geany.h contain not much besides some defines. - Add a little header file "app.h" for GeanyApp and move it there - Move "app" global to new "app.h" file - Move "ignore_callback" global to "callbacks.h" - Move "geany_object" global to "geanyobject.h" * Add an include in "geany.h" for "app.h" since GeanyApp used to be defined there and some plugins included this header to access GeanyApp. * Include "gtkcompat.h" everywhere instead of gtk/gtk.h so that everywhere sees the same definitions (not a problem in practice AFAIK so this could be changed back if better that way. * Remove forward declarations from previous commits as some people apparently consider this bad style, despite that it reduces inter- header dependencies. TODO: * As always, to test on win32 * As always, to test with not Autotools * Test plugins better, both builtin and geany-plugins, likely API/ABI bump * Test with various defines/flags that may change what is included * win32.[ch] not really touched since I couldn't test
2014-05-18 17:31:51 -07:00
#include "app.h"
#include "dialogs.h"
#include "documentprivate.h"
#include "editor.h"
Include what you use This is a mega-commit - because most of it had to be done in one go otherwise some commits would fail to compile - that attempts to fix a few problems with Geany's includes as well as various other related cleanups. After this change it's easier to use includes and there's little worry about which order things are included in or who includes what. Overview of changes: * Include config.h at the start of each source file if HAVE_CONFIG_H is defined (and never in headers). * Go through each source file and make the includes section generally like this: - Always config.h first as above - Then if the file has a header with the same name, include that - Then include in alphabetical order each other internal/geany header. - Then include standard headers - Then include non-standard system headers - Then include GLib/GTK+ related stuff * Doing as above makes it easier to find implicit header include dependencies and it exposed quite a few weird problems with includes or forward declarations, fix those. * Make geany.h contain not much besides some defines. - Add a little header file "app.h" for GeanyApp and move it there - Move "app" global to new "app.h" file - Move "ignore_callback" global to "callbacks.h" - Move "geany_object" global to "geanyobject.h" * Add an include in "geany.h" for "app.h" since GeanyApp used to be defined there and some plugins included this header to access GeanyApp. * Include "gtkcompat.h" everywhere instead of gtk/gtk.h so that everywhere sees the same definitions (not a problem in practice AFAIK so this could be changed back if better that way. * Remove forward declarations from previous commits as some people apparently consider this bad style, despite that it reduces inter- header dependencies. TODO: * As always, to test on win32 * As always, to test with not Autotools * Test plugins better, both builtin and geany-plugins, likely API/ABI bump * Test with various defines/flags that may change what is included * win32.[ch] not really touched since I couldn't test
2014-05-18 17:31:51 -07:00
#include "encodings.h"
#include "filetypes.h"
#include "geanywraplabel.h"
Include what you use This is a mega-commit - because most of it had to be done in one go otherwise some commits would fail to compile - that attempts to fix a few problems with Geany's includes as well as various other related cleanups. After this change it's easier to use includes and there's little worry about which order things are included in or who includes what. Overview of changes: * Include config.h at the start of each source file if HAVE_CONFIG_H is defined (and never in headers). * Go through each source file and make the includes section generally like this: - Always config.h first as above - Then if the file has a header with the same name, include that - Then include in alphabetical order each other internal/geany header. - Then include standard headers - Then include non-standard system headers - Then include GLib/GTK+ related stuff * Doing as above makes it easier to find implicit header include dependencies and it exposed quite a few weird problems with includes or forward declarations, fix those. * Make geany.h contain not much besides some defines. - Add a little header file "app.h" for GeanyApp and move it there - Move "app" global to new "app.h" file - Move "ignore_callback" global to "callbacks.h" - Move "geany_object" global to "geanyobject.h" * Add an include in "geany.h" for "app.h" since GeanyApp used to be defined there and some plugins included this header to access GeanyApp. * Include "gtkcompat.h" everywhere instead of gtk/gtk.h so that everywhere sees the same definitions (not a problem in practice AFAIK so this could be changed back if better that way. * Remove forward declarations from previous commits as some people apparently consider this bad style, despite that it reduces inter- header dependencies. TODO: * As always, to test on win32 * As always, to test with not Autotools * Test plugins better, both builtin and geany-plugins, likely API/ABI bump * Test with various defines/flags that may change what is included * win32.[ch] not really touched since I couldn't test
2014-05-18 17:31:51 -07:00
#include "keybindingsprivate.h"
#include "keyfile.h"
#include "msgwindow.h"
#include "prefs.h"
#include "printing.h"
#include "sidebar.h"
#include "stash.h"
#include "support.h"
#include "templates.h"
#include "toolbar.h"
#include "tools.h"
Include what you use This is a mega-commit - because most of it had to be done in one go otherwise some commits would fail to compile - that attempts to fix a few problems with Geany's includes as well as various other related cleanups. After this change it's easier to use includes and there's little worry about which order things are included in or who includes what. Overview of changes: * Include config.h at the start of each source file if HAVE_CONFIG_H is defined (and never in headers). * Go through each source file and make the includes section generally like this: - Always config.h first as above - Then if the file has a header with the same name, include that - Then include in alphabetical order each other internal/geany header. - Then include standard headers - Then include non-standard system headers - Then include GLib/GTK+ related stuff * Doing as above makes it easier to find implicit header include dependencies and it exposed quite a few weird problems with includes or forward declarations, fix those. * Make geany.h contain not much besides some defines. - Add a little header file "app.h" for GeanyApp and move it there - Move "app" global to new "app.h" file - Move "ignore_callback" global to "callbacks.h" - Move "geany_object" global to "geanyobject.h" * Add an include in "geany.h" for "app.h" since GeanyApp used to be defined there and some plugins included this header to access GeanyApp. * Include "gtkcompat.h" everywhere instead of gtk/gtk.h so that everywhere sees the same definitions (not a problem in practice AFAIK so this could be changed back if better that way. * Remove forward declarations from previous commits as some people apparently consider this bad style, despite that it reduces inter- header dependencies. TODO: * As always, to test on win32 * As always, to test with not Autotools * Test plugins better, both builtin and geany-plugins, likely API/ABI bump * Test with various defines/flags that may change what is included * win32.[ch] not really touched since I couldn't test
2014-05-18 17:31:51 -07:00
#include "ui_utils.h"
#include "utils.h"
#include "vte.h"
Include what you use This is a mega-commit - because most of it had to be done in one go otherwise some commits would fail to compile - that attempts to fix a few problems with Geany's includes as well as various other related cleanups. After this change it's easier to use includes and there's little worry about which order things are included in or who includes what. Overview of changes: * Include config.h at the start of each source file if HAVE_CONFIG_H is defined (and never in headers). * Go through each source file and make the includes section generally like this: - Always config.h first as above - Then if the file has a header with the same name, include that - Then include in alphabetical order each other internal/geany header. - Then include standard headers - Then include non-standard system headers - Then include GLib/GTK+ related stuff * Doing as above makes it easier to find implicit header include dependencies and it exposed quite a few weird problems with includes or forward declarations, fix those. * Make geany.h contain not much besides some defines. - Add a little header file "app.h" for GeanyApp and move it there - Move "app" global to new "app.h" file - Move "ignore_callback" global to "callbacks.h" - Move "geany_object" global to "geanyobject.h" * Add an include in "geany.h" for "app.h" since GeanyApp used to be defined there and some plugins included this header to access GeanyApp. * Include "gtkcompat.h" everywhere instead of gtk/gtk.h so that everywhere sees the same definitions (not a problem in practice AFAIK so this could be changed back if better that way. * Remove forward declarations from previous commits as some people apparently consider this bad style, despite that it reduces inter- header dependencies. TODO: * As always, to test on win32 * As always, to test with not Autotools * Test plugins better, both builtin and geany-plugins, likely API/ABI bump * Test with various defines/flags that may change what is included * win32.[ch] not really touched since I couldn't test
2014-05-18 17:31:51 -07:00
#include "gtkcompat.h"
#include <stdlib.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
GeanyPrefs prefs;
GeanyToolPrefs tool_prefs;
typedef struct
{
GtkTreeStore *store;
GtkTreeView *tree;
gboolean edited;
}
KbData;
static KbData global_kb_data = { NULL, NULL, FALSE };
static GtkTreeView *various_treeview = NULL;
static GeanyKeyBinding *kb_index(guint gidx, guint kid);
static void kb_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path, gchar *new_text, KbData *kbdata);
static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *event, GtkLabel *label);
static void kb_change_iter_shortcut(KbData *kbdata, GtkTreeIter *iter, const gchar *new_text);
static gboolean kb_find_duplicate(GtkTreeStore *store, GtkWidget *parent, GtkTreeIter *old_iter,
guint key, GdkModifierType mods, const gchar *shortcut);
static void on_toolbar_show_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_show_notebook_tabs_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_enable_plugins_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_sidebar_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_prefs_print_radio_button_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_prefs_print_page_header_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void open_preferences_help(void);
typedef enum PrefCallbackAction
{
PREF_DISPLAY,
PREF_UPDATE
}
PrefCallbackAction;
/* Synchronize Stash settings with widgets (see keyfile.c - init_pref_groups()). */
static void prefs_action(PrefCallbackAction action)
{
StashGroup *group;
guint i;
foreach_ptr_array(group, i, pref_groups)
{
switch (action)
{
case PREF_DISPLAY:
stash_group_display(group, ui_widgets.prefs_dialog);
break;
case PREF_UPDATE:
stash_group_update(group, ui_widgets.prefs_dialog);
break;
}
}
switch (action)
{
case PREF_DISPLAY:
stash_tree_display(various_treeview);
break;
case PREF_UPDATE:
stash_tree_update(various_treeview);
break;
}
}
enum
{
KB_TREE_ACTION,
KB_TREE_SHORTCUT,
KB_TREE_INDEX,
KB_TREE_EDITABLE,
KB_TREE_WEIGHT,
KB_TREE_COLUMNS
};
static void kb_tree_view_change_button_clicked_cb(GtkWidget *button, KbData *kbdata)
{
GtkTreeModel *model;
GtkTreeIter iter;
GtkTreeSelection *selection;
gchar *name;
selection = gtk_tree_view_get_selection(kbdata->tree);
if (gtk_tree_selection_get_selected(selection, &model, &iter))
{
if (gtk_tree_model_iter_has_child(model, &iter))
{ /* double click on a section to expand or collapse it */
GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
if (gtk_tree_view_row_expanded(kbdata->tree, path))
gtk_tree_view_collapse_row(kbdata->tree, path);
else
gtk_tree_view_expand_row(kbdata->tree, path, FALSE);
gtk_tree_path_free(path);
return;
}
gtk_tree_model_get(model, &iter, KB_TREE_ACTION, &name, -1);
if (name != NULL)
{
GtkWidget *dialog;
GtkWidget *label;
GtkWidget *accel_label;
gchar *str;
dialog = gtk_dialog_new_with_buttons(_("Grab Key"), GTK_WINDOW(ui_widgets.prefs_dialog),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
str = g_strdup_printf(
_("Press the combination of the keys you want to use for \"%s\"."), name);
label = gtk_label_new(str);
gtk_misc_set_padding(GTK_MISC(label), 5, 10);
2012-09-11 16:48:57 +02:00
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label);
accel_label = gtk_label_new("");
gtk_misc_set_padding(GTK_MISC(accel_label), 5, 10);
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), accel_label);
g_signal_connect(dialog, "key-press-event",
G_CALLBACK(kb_grab_key_dialog_key_press_cb), accel_label);
gtk_widget_show_all(dialog);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
{
const gchar *new_text = gtk_label_get_text(GTK_LABEL(accel_label));
kb_change_iter_shortcut(kbdata, &iter, new_text);
}
gtk_widget_destroy(dialog);
g_free(str);
g_free(name);
}
}
}
static void kb_show_popup_menu(KbData *kbdata, GtkWidget *widget, GdkEventButton *event)
{
GtkWidget *item;
static GtkWidget *menu = NULL;
guint button;
guint32 event_time;
if (menu == NULL)
{
menu = gtk_menu_new();
item = ui_image_menu_item_new(GTK_STOCK_ADD, _("_Expand All"));
gtk_widget_show(item);
gtk_container_add(GTK_CONTAINER(menu), item);
g_signal_connect_swapped(item, "activate", G_CALLBACK(gtk_tree_view_expand_all), kbdata->tree);
item = ui_image_menu_item_new(GTK_STOCK_REMOVE, _("_Collapse All"));
gtk_widget_show(item);
gtk_container_add(GTK_CONTAINER(menu), item);
g_signal_connect_swapped(item, "activate", G_CALLBACK(gtk_tree_view_collapse_all), kbdata->tree);
gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL);
}
if (event != NULL)
{
button = event->button;
event_time = event->time;
}
else
{
button = 0;
event_time = gtk_get_current_event_time();
}
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, event_time);
}
static gboolean kb_popup_menu_cb(GtkWidget *widget, KbData *kbdata)
{
kb_show_popup_menu(kbdata, widget, NULL);
return TRUE;
}
static gboolean kb_tree_view_button_press_event_cb(GtkWidget *widget, GdkEventButton *event,
KbData *kbdata)
{
if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
{
kb_show_popup_menu(kbdata, widget, event);
return TRUE;
}
else if (event->type == GDK_2BUTTON_PRESS)
{
kb_tree_view_change_button_clicked_cb(NULL, kbdata);
return TRUE;
}
return FALSE;
}
static void kb_init_tree(KbData *kbdata)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
kbdata->tree = GTK_TREE_VIEW(ui_lookup_widget(ui_widgets.prefs_dialog, "treeview7"));
kbdata->store = gtk_tree_store_new(KB_TREE_COLUMNS,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_INT);
gtk_tree_view_set_model(GTK_TREE_VIEW(kbdata->tree), GTK_TREE_MODEL(kbdata->store));
g_object_unref(kbdata->store);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Action"), renderer,
"text", KB_TREE_ACTION, "weight", KB_TREE_WEIGHT, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(kbdata->tree), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Shortcut"), renderer,
"text", KB_TREE_SHORTCUT, "editable", KB_TREE_EDITABLE,
"weight", KB_TREE_WEIGHT, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(kbdata->tree), column);
/* set policy settings for the scrolled window around the treeview again, because glade
* doesn't keep the settings */
gtk_scrolled_window_set_policy(
GTK_SCROLLED_WINDOW(ui_lookup_widget(ui_widgets.prefs_dialog, "scrolledwindow8")),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
g_signal_connect(renderer, "edited", G_CALLBACK(kb_cell_edited_cb), kbdata);
g_signal_connect(kbdata->tree, "button-press-event", G_CALLBACK(kb_tree_view_button_press_event_cb), kbdata);
g_signal_connect(kbdata->tree, "popup-menu", G_CALLBACK(kb_popup_menu_cb), kbdata);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button2"), "clicked",
G_CALLBACK(kb_tree_view_change_button_clicked_cb), kbdata);
}
static void kb_set_shortcut(GtkTreeStore *store, GtkTreeIter *iter,
guint key, GdkModifierType mods)
{
gchar *key_string = gtk_accelerator_name(key, mods);
GtkTreeIter parent;
guint kid, gid;
GeanyKeyBinding *kb;
gboolean bold;
gtk_tree_store_set(store, iter, KB_TREE_SHORTCUT, key_string, -1);
g_free(key_string);
gtk_tree_model_get(GTK_TREE_MODEL(store), iter, KB_TREE_INDEX, &kid, -1);
gtk_tree_model_iter_parent(GTK_TREE_MODEL(store), &parent, iter);
gtk_tree_model_get(GTK_TREE_MODEL(store), &parent, KB_TREE_INDEX, &gid, -1);
kb = kb_index(gid, kid);
bold = key != kb->default_key || mods != kb->default_mods;
gtk_tree_store_set(store, iter, KB_TREE_WEIGHT,
bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, -1);
}
2013-05-19 20:00:01 +04:00
void prefs_kb_search_name(const gchar *search)
{
GtkTreeIter iter;
gboolean valid;
GtkTreeModel *model;
KbData *kbdata = &global_kb_data;
model = gtk_tree_view_get_model(kbdata->tree);
2013-05-19 20:00:01 +04:00
valid = gtk_tree_model_get_iter_first(model, &iter);
while (valid)
{
gchar *name;
2013-05-19 20:00:01 +04:00
gtk_tree_model_get(model, &iter, KB_TREE_ACTION, &name, -1);
if (g_strcmp0(name, search) == 0)
2013-05-19 20:00:01 +04:00
{
GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
gtk_tree_view_scroll_to_cell(kbdata->tree, path, NULL, TRUE, .0f, .0f);
2013-05-19 20:00:01 +04:00
gtk_tree_path_free(path);
g_free(name);
2013-05-19 20:00:01 +04:00
break;
}
g_free(name);
2013-05-19 20:00:01 +04:00
valid = gtk_tree_model_iter_next(model, &iter);
}
}
static void kb_init(KbData *kbdata)
{
GtkTreeIter parent, iter;
gsize g, i;
gchar *label;
GeanyKeyGroup *group;
GeanyKeyBinding *kb;
if (kbdata->store == NULL)
kb_init_tree(kbdata);
foreach_ptr_array(group, g, keybinding_groups)
{
gtk_tree_store_append(kbdata->store, &parent, NULL);
gtk_tree_store_set(kbdata->store, &parent, KB_TREE_ACTION, group->label,
KB_TREE_INDEX, g, -1);
foreach_ptr_array(kb, i, group->key_items)
{
label = keybindings_get_label(kb);
gtk_tree_store_append(kbdata->store, &iter, &parent);
gtk_tree_store_set(kbdata->store, &iter, KB_TREE_ACTION, label,
KB_TREE_EDITABLE, TRUE, KB_TREE_INDEX, kb->id, -1);
kb_set_shortcut(kbdata->store, &iter, kb->key, kb->mods);
g_free(label);
}
}
gtk_tree_view_expand_all(GTK_TREE_VIEW(kbdata->tree));
}
/* note: new 'simple' prefs should use Stash code in keyfile.c */
static void prefs_init_dialog(void)
{
GtkWidget *widget;
2013-12-04 14:59:05 +01:00
GdkColor color = {0};
/* Synchronize with Stash settings */
prefs_action(PREF_DISPLAY);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "label_project_indent_warning");
ui_widget_show_hide(widget, app->project != NULL);
/* General settings */
/* startup */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_load_session");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.load_session);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_session");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), project_prefs.project_session);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_file_in_basedir");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), project_prefs.project_file_in_basedir);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_save_win_pos");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.save_winpos);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_ask_for_quit");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.confirm_exit);
/* behaviour */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_beep");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.beep_on_errors);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_switch_pages");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.switch_to_status);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_suppress_status_msgs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.suppress_status_messages);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_auto_focus");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.auto_focus);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_native_windows_dialogs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
interface_prefs.use_native_windows_dialogs);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction");
gtk_entry_set_text(GTK_ENTRY(widget), tool_prefs.context_action_cmd);
project_setup_prefs(); /* project files path */
/* Interface settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_sidebar_visible");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ui_prefs.sidebar_visible);
on_sidebar_visible_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_symbol");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.sidebar_symbol_visible);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.sidebar_openfiles_visible);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "tagbar_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), interface_prefs.tagbar_font);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "msgwin_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), interface_prefs.msgwin_font);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "editor_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), interface_prefs.editor_font);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_long_line");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.long_line_column);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_long_line");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.long_line_enabled);
switch (editor_prefs.long_line_type)
{
case 0: widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_line"); break;
case 1: widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_background"); break;
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
utils_parse_color(editor_prefs.long_line_color, &color);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "long_line_color");
2013-12-04 14:59:05 +01:00
gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), &color);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.show_notebook_tabs);
/* disable following setting if notebook tabs are hidden */
on_show_notebook_tabs_toggled(GTK_TOGGLE_BUTTON(
ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs")), NULL);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_tab_cross");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.show_tab_cross);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_editor");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), interface_prefs.tab_pos_editor);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_msgwin");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), interface_prefs.tab_pos_msgwin);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_sidebar");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), interface_prefs.tab_pos_sidebar);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_statusbar_visible");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.statusbar_visible);
/* Toolbar settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), toolbar_prefs.visible);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_in_menu");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), toolbar_prefs.append_to_menu);
switch (toolbar_prefs.icon_style)
{
case 0: widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_image"); break;
case 1: widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_text"); break;
default: widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_imagetext"); break;
}
if (toolbar_prefs.use_gtk_default_style)
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_style_default");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
switch (toolbar_prefs.icon_size)
{
case GTK_ICON_SIZE_LARGE_TOOLBAR:
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_large"); break;
case GTK_ICON_SIZE_SMALL_TOOLBAR:
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_small"); break;
default: widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_verysmall"); break;
}
if (toolbar_prefs.use_gtk_default_icon)
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_icon_default");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
/* disable elements if toolbar is hidden */
on_toolbar_show_toggled(GTK_TOGGLE_BUTTON(
ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show")), NULL);
/* Files settings */
if (file_prefs.tab_order_ltr)
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_tab_right");
else
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_tab_left");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_tab_beside");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.tab_order_beside);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(widget), file_prefs.default_new_encoding);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(file_prefs.default_open_encoding >= 0) ? TRUE : FALSE);
on_open_encoding_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
if (file_prefs.default_open_encoding >= 0)
{
ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(widget), file_prefs.default_open_encoding);
}
else
ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(widget), GEANY_ENCODING_UTF_8);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_eol");
if (file_prefs.default_eol_character >= 0 && file_prefs.default_eol_character < 3)
{
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), file_prefs.default_eol_character);
}
else
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), GEANY_DEFAULT_EOL_CHARACTER);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_trailing_spaces");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.strip_trailing_spaces);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_new_line");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.final_new_line);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_ensure_convert_new_lines");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.ensure_convert_new_lines);
/* Editor settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_toggle_mark");
gtk_entry_set_text(GTK_ENTRY(widget), editor_prefs.comment_toggle_mark);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_replace_tabs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.replace_tabs);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_indent");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_indent_guide);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_white_space");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_white_space);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_line_end");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_line_endings);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_line_numbers");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_linenumber_margin);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_markers_margin");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_markers_margin);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_scroll_stop_at_last_line");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.scroll_stop_at_last_line);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_line_wrapping");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.line_wrapping);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_complete_snippets");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.complete_snippets);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_xmltag");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.auto_close_xml_tags);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_folding");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.folding);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_unfold_children");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.unfold_all_children);
on_use_folding_toggled(GTK_TOGGLE_BUTTON(
ui_lookup_widget(ui_widgets.prefs_dialog, "check_folding")), NULL);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_disable_dnd");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.disable_dnd);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_smart_home");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.smart_home_key);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_newline_strip");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.newline_strip);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_indicators");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.use_indicators);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_auto_multiline");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.auto_continue_multiline);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_symbol_auto_completion");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.auto_complete_symbols);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_symbollistheight");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.symbolcompletion_max_height);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_symbol_complete_chars");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.symbolcompletion_min_chars);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_line_break");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.line_break_column);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_parenthesis");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(editor_prefs.autoclose_chars & GEANY_AC_PARENTHESIS));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_cbracket");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(editor_prefs.autoclose_chars & GEANY_AC_CBRACKET));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_sbracket");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(editor_prefs.autoclose_chars & GEANY_AC_SBRACKET));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_squote");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(editor_prefs.autoclose_chars & GEANY_AC_SQUOTE));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_dquote");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(editor_prefs.autoclose_chars & GEANY_AC_DQUOTE));
/* Tools Settings */
if (tool_prefs.term_cmd)
gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term")), tool_prefs.term_cmd);
if (tool_prefs.browser_cmd)
gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_browser")), tool_prefs.browser_cmd);
if (tool_prefs.grep_cmd)
gtk_entry_set_text(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep")), tool_prefs.grep_cmd);
/* Template settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_developer");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.developer);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_company");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.company);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_mail");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.mail);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_initial");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.initials);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_version");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.version);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_year");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.year_format);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_date");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.date_format);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_datetime");
gtk_entry_set_text(GTK_ENTRY(widget), template_prefs.datetime_format);
/* Keybindings */
kb_init(&global_kb_data);
/* Printing */
{
GtkWidget *widget_gtk = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_print_gtk");
if (printing_prefs.use_gtk_printing)
widget = widget_gtk;
else
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_print_external");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
on_prefs_print_radio_button_toggled(GTK_TOGGLE_BUTTON(widget_gtk), NULL);
}
if (printing_prefs.external_print_cmd)
gtk_entry_set_text(
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_print_external_cmd")),
printing_prefs.external_print_cmd);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_linenumbers");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), printing_prefs.print_line_numbers);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_pagenumbers");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), printing_prefs.print_page_numbers);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_pageheader");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), printing_prefs.print_page_header);
on_prefs_print_page_header_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_basename");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), printing_prefs.page_header_basename);
if (printing_prefs.page_header_datefmt)
gtk_entry_set_text(
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_print_dateformat")),
printing_prefs.page_header_datefmt);
#ifndef HAVE_PLUGINS
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_plugins"), FALSE);
#endif
on_enable_plugins_toggled(GTK_TOGGLE_BUTTON( ui_lookup_widget(ui_widgets.prefs_dialog, "check_plugins")), NULL);
#ifdef HAVE_VTE
/* make VTE switch visible only when VTE is compiled in, it is hidden by default */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_vte");
gtk_widget_show(widget);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vte_info.load_vte);
/* VTE settings */
if (vte_info.have_vte)
{
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "font_term");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), vc->font);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "color_fore");
gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), &vc->colour_fore);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "color_back");
gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), &vc->colour_back);
2012-12-18 10:26:48 +01:00
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_image");
gtk_entry_set_text(GTK_ENTRY(widget), vc->image);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_scrollback");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), vc->scrollback_lines);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_shell");
gtk_entry_set_text(GTK_ENTRY(widget), vc->shell);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_scroll_key");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->scroll_on_key);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_scroll_out");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->scroll_on_out);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_enable_bash_keys");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->enable_bash_keys);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_ignore_menu_key");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->ignore_menu_bar_accel);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_follow_path");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->follow_path);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_run_in_vte");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->run_in_vte);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_skip_script");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->skip_run_script);
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_cursor_blinks");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->cursor_blinks);
}
#endif
}
/* note: uses group index, not group id, unlike keybindings_lookup_item(). */
static GeanyKeyBinding *kb_index(guint gidx, guint kid)
{
GeanyKeyGroup *group;
group = g_ptr_array_index(keybinding_groups, gidx);
return keybindings_get_item(group, kid);
}
/* read the treeview shortcut fields into keybindings */
static void kb_update(KbData *kbdata)
{
GtkTreeModel *model = GTK_TREE_MODEL(kbdata->store);
GtkTreeIter child, parent;
guint gid = 0;
/* get first parent */
if (! gtk_tree_model_iter_children(model, &parent, NULL))
return;
/* foreach parent */
while (TRUE)
{
/* get first child */
if (! gtk_tree_model_iter_children(model, &child, &parent))
return;
/* foreach child */
while (TRUE)
{
guint kid;
gchar *str;
guint key;
GdkModifierType mods;
GeanyKeyBinding *kb;
gtk_tree_model_get(model, &child, KB_TREE_INDEX, &kid, KB_TREE_SHORTCUT, &str, -1);
gtk_accelerator_parse(str, &key, &mods);
g_free(str);
kb = kb_index(gid, kid);
if (kb->key != key || kb->mods != mods)
keybindings_update_combo(kb, key, mods);
if (! gtk_tree_model_iter_next(model, &child))
break;
}
if (! gtk_tree_model_iter_next(model, &parent))
return;
gid++;
}
}
/*
* callbacks
*/
/* note: new 'simple' prefs should use Stash code in keyfile.c */
static void
on_prefs_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
{
if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY)
{
GtkWidget *widget;
guint i;
gboolean autoclose_brackets[5];
gboolean old_invert_all = interface_prefs.highlighting_invert_all;
gboolean old_sidebar_pos = interface_prefs.sidebar_pos;
GeanyDocument *doc = document_get_current();
/* Synchronize Stash settings */
prefs_action(PREF_UPDATE);
if (interface_prefs.highlighting_invert_all != old_invert_all)
filetypes_reload();
if (interface_prefs.sidebar_pos != old_sidebar_pos)
ui_swap_sidebar_pos();
widget = ui_lookup_widget(main_widgets.window, "vpaned1");
gtk_orientable_set_orientation(GTK_ORIENTABLE(widget), interface_prefs.msgwin_orientation);
/* General settings */
/* startup */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_load_session");
prefs.load_session = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_session");
project_prefs.project_session = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_file_in_basedir");
project_prefs.project_file_in_basedir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_save_win_pos");
prefs.save_winpos = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_ask_for_quit");
prefs.confirm_exit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
/* behaviour */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_beep");
prefs.beep_on_errors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_switch_pages");
prefs.switch_to_status = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_suppress_status_msgs");
prefs.suppress_status_messages = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_auto_focus");
prefs.auto_focus = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_native_windows_dialogs");
interface_prefs.use_native_windows_dialogs =
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction");
g_free(tool_prefs.context_action_cmd);
tool_prefs.context_action_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
project_apply_prefs(); /* project file path */
/* Interface settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_sidebar_visible");
ui_prefs.sidebar_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_symbol");
interface_prefs.sidebar_symbol_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles");
interface_prefs.sidebar_openfiles_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_long_line");
editor_prefs.long_line_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_line");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
editor_prefs.long_line_type = 0;
else
/* now only the "background" radio remains */
editor_prefs.long_line_type = 1;
if (editor_prefs.long_line_column == 0)
editor_prefs.long_line_enabled = FALSE;
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs");
interface_prefs.show_notebook_tabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_tab_cross");
file_prefs.show_tab_cross = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_editor");
interface_prefs.tab_pos_editor = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_msgwin");
interface_prefs.tab_pos_msgwin = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_sidebar");
interface_prefs.tab_pos_sidebar = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_statusbar_visible");
interface_prefs.statusbar_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
/* Toolbar settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show");
toolbar_prefs.visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_in_menu");
toolbar_prefs.append_to_menu = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_style_default");
toolbar_prefs.use_gtk_default_style = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
if (! toolbar_prefs.use_gtk_default_style)
{
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_imagetext");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
toolbar_prefs.icon_style = 2;
else
{
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_image");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
toolbar_prefs.icon_style = 0;
else
/* now only the text only radio remains, so set text only */
toolbar_prefs.icon_style = 1;
}
}
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_icon_default");
toolbar_prefs.use_gtk_default_icon = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
if (! toolbar_prefs.use_gtk_default_icon)
{ toolbar_prefs.icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_large");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
toolbar_prefs.icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
else
{
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_small");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
toolbar_prefs.icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR;
else
toolbar_prefs.icon_size = GTK_ICON_SIZE_MENU;
}
}
/* Files settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_tab_right");
file_prefs.tab_order_ltr = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_tab_beside");
file_prefs.tab_order_beside = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
file_prefs.default_new_encoding = ui_encodings_combo_box_get_active_encoding(GTK_COMBO_BOX(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
{
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
file_prefs.default_open_encoding = ui_encodings_combo_box_get_active_encoding(GTK_COMBO_BOX(widget));
}
else
file_prefs.default_open_encoding = -1;
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_eol");
file_prefs.default_eol_character = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_trailing_spaces");
file_prefs.strip_trailing_spaces = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_new_line");
file_prefs.final_new_line = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_ensure_convert_new_lines");
file_prefs.ensure_convert_new_lines = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_replace_tabs");
file_prefs.replace_tabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
/* Editor settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_toggle_mark");
SETPTR(editor_prefs.comment_toggle_mark,
gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_long_line");
/* note: use stash for new code - it updates spin buttons itself */
gtk_spin_button_update(GTK_SPIN_BUTTON(widget));
editor_prefs.long_line_column = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_folding");
editor_prefs.folding = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
ui_update_fold_items();
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_unfold_children");
editor_prefs.unfold_all_children = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_indent");
editor_prefs.show_indent_guide = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_white_space");
editor_prefs.show_white_space = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_line_end");
editor_prefs.show_line_endings = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_line_numbers");
editor_prefs.show_linenumber_margin = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_markers_margin");
editor_prefs.show_markers_margin = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_scroll_stop_at_last_line");
editor_prefs.scroll_stop_at_last_line = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_line_wrapping");
editor_prefs.line_wrapping = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_complete_snippets");
editor_prefs.complete_snippets = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_xmltag");
editor_prefs.auto_close_xml_tags = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_indicators");
editor_prefs.use_indicators = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_disable_dnd");
editor_prefs.disable_dnd = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_smart_home");
editor_prefs.smart_home_key = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_newline_strip");
editor_prefs.newline_strip = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_auto_multiline");
editor_prefs.auto_continue_multiline = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_symbol_auto_completion");
editor_prefs.auto_complete_symbols = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_symbol_complete_chars");
gtk_spin_button_update(GTK_SPIN_BUTTON(widget));
editor_prefs.symbolcompletion_min_chars = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_symbollistheight");
gtk_spin_button_update(GTK_SPIN_BUTTON(widget));
editor_prefs.symbolcompletion_max_height = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_line_break");
gtk_spin_button_update(GTK_SPIN_BUTTON(widget));
editor_prefs.line_break_column = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_parenthesis");
autoclose_brackets[0] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_cbracket");
autoclose_brackets[1] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_sbracket");
autoclose_brackets[2] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_squote");
autoclose_brackets[3] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_autoclose_dquote");
autoclose_brackets[4] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
editor_prefs.autoclose_chars =
(autoclose_brackets[0] ? GEANY_AC_PARENTHESIS : 0u)
| (autoclose_brackets[1] ? GEANY_AC_CBRACKET : 0u)
| (autoclose_brackets[2] ? GEANY_AC_SBRACKET : 0u)
| (autoclose_brackets[3] ? GEANY_AC_SQUOTE : 0u)
| (autoclose_brackets[4] ? GEANY_AC_DQUOTE : 0u);
/* Tools Settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term");
g_free(tool_prefs.term_cmd);
tool_prefs.term_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_browser");
g_free(tool_prefs.browser_cmd);
tool_prefs.browser_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep");
g_free(tool_prefs.grep_cmd);
tool_prefs.grep_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
/* Template settings */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_developer");
g_free(template_prefs.developer);
template_prefs.developer = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_company");
g_free(template_prefs.company);
template_prefs.company = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_mail");
g_free(template_prefs.mail);
template_prefs.mail = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_initial");
g_free(template_prefs.initials);
template_prefs.initials = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_version");
g_free(template_prefs.version);
template_prefs.version = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_year");
g_free(template_prefs.year_format);
template_prefs.year_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_date");
g_free(template_prefs.date_format);
template_prefs.date_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_template_datetime");
g_free(template_prefs.datetime_format);
template_prefs.datetime_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
/* Keybindings */
if (global_kb_data.edited)
{
kb_update(&global_kb_data);
tools_create_insert_custom_command_menu_items();
keybindings_write_to_file();
}
/* Printing */
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_print_gtk");
printing_prefs.use_gtk_printing = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_print_external_cmd");
g_free(printing_prefs.external_print_cmd);
printing_prefs.external_print_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_linenumbers");
printing_prefs.print_line_numbers = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_pagenumbers");
printing_prefs.print_page_numbers = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_pageheader");
printing_prefs.print_page_header = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_basename");
printing_prefs.page_header_basename = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_print_dateformat");
g_free(printing_prefs.page_header_datefmt);
printing_prefs.page_header_datefmt = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
#ifdef HAVE_VTE
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_vte");
vte_info.load_vte = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
/* VTE settings */
if (vte_info.have_vte)
{
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "spin_scrollback");
gtk_spin_button_update(GTK_SPIN_BUTTON(widget));
vc->scrollback_lines = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
2012-12-18 10:26:48 +01:00
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_image");
g_free(vc->image);
vc->image = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "entry_shell");
g_free(vc->shell);
vc->shell = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_scroll_key");
vc->scroll_on_key = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_scroll_out");
vc->scroll_on_out = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_enable_bash_keys");
vc->enable_bash_keys = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_ignore_menu_key");
vc->ignore_menu_bar_accel = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_follow_path");
vc->follow_path = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_run_in_vte");
vc->run_in_vte = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_skip_script");
vc->skip_run_script = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_cursor_blinks");
vc->cursor_blinks = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
vte_apply_user_settings();
}
#endif
/* apply the changes made */
ui_statusbar_showhide(interface_prefs.statusbar_visible);
sidebar_openfiles_update_all(); /* to update if full path setting has changed */
toolbar_apply_settings();
toolbar_update_ui();
toolbar_show_hide();
ui_sidebar_show_hide();
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(main_widgets.notebook), interface_prefs.show_notebook_tabs);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(main_widgets.notebook), interface_prefs.tab_pos_editor);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(msgwindow.notebook), interface_prefs.tab_pos_msgwin);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(main_widgets.sidebar_notebook), interface_prefs.tab_pos_sidebar);
/* re-colourise all open documents, if tab width or long line settings have changed */
for (i = 0; i < documents_array->len; i++)
{
if (documents[i]->is_valid)
{
editor_apply_update_prefs(documents[i]->editor);
if (! editor_prefs.folding)
editor_unfold_all(documents[i]->editor);
}
}
ui_document_show_hide(NULL);
ui_update_view_editor_menu_items();
/* various preferences */
ui_save_buttons_toggle((doc != NULL) ? doc->changed : FALSE);
msgwin_show_hide_tabs();
ui_update_statusbar(doc, -1);
/* store all settings */
configuration_save();
}
if (response == GTK_RESPONSE_HELP)
{
open_preferences_help();
}
else if (response != GTK_RESPONSE_APPLY)
{
gtk_tree_store_clear(global_kb_data.store);
gtk_widget_hide(GTK_WIDGET(dialog));
}
}
static void on_color_button_choose_cb(GtkColorButton *widget, gpointer user_data)
{
GdkColor color;
gtk_color_button_get_color(widget, &color);
SETPTR(editor_prefs.long_line_color, utils_get_hex_from_color(&color));
}
static void on_prefs_font_choosed(GtkFontButton *widget, gpointer user_data)
{
const gchar *fontbtn = gtk_font_button_get_font_name(widget);
guint i;
switch (GPOINTER_TO_INT(user_data))
{
case 1:
{
if (strcmp(fontbtn, interface_prefs.tagbar_font) == 0)
break;
SETPTR(interface_prefs.tagbar_font, g_strdup(fontbtn));
for (i = 0; i < documents_array->len; i++)
{
GeanyDocument *doc = documents[i];
if (documents[i]->is_valid && GTK_IS_WIDGET(doc->priv->tag_tree))
ui_widget_modify_font_from_string(doc->priv->tag_tree,
interface_prefs.tagbar_font);
}
if (GTK_IS_WIDGET(tv.default_tag_tree))
ui_widget_modify_font_from_string(tv.default_tag_tree, interface_prefs.tagbar_font);
ui_widget_modify_font_from_string(tv.tree_openfiles, interface_prefs.tagbar_font);
break;
}
case 2:
{
if (strcmp(fontbtn, interface_prefs.msgwin_font) == 0)
break;
SETPTR(interface_prefs.msgwin_font, g_strdup(fontbtn));
ui_widget_modify_font_from_string(msgwindow.tree_compiler, interface_prefs.msgwin_font);
ui_widget_modify_font_from_string(msgwindow.tree_msg, interface_prefs.msgwin_font);
ui_widget_modify_font_from_string(msgwindow.tree_status, interface_prefs.msgwin_font);
ui_widget_modify_font_from_string(msgwindow.scribble, interface_prefs.msgwin_font);
break;
}
case 3:
{
ui_set_editor_font(fontbtn);
break;
}
}
}
static void kb_change_iter_shortcut(KbData *kbdata, GtkTreeIter *iter, const gchar *new_text)
{
guint lkey;
GdkModifierType lmods;
gtk_accelerator_parse(new_text, &lkey, &lmods);
if (kb_find_duplicate(kbdata->store, ui_widgets.prefs_dialog, iter, lkey, lmods, new_text))
return;
/* set the values here, because of the above check, setting it in
* gtk_accelerator_parse would return a wrong key combination if it is duplicate */
kb_set_shortcut(kbdata->store, iter, lkey, lmods);
kbdata->edited = TRUE;
}
static void kb_cell_edited_cb(GtkCellRendererText *cellrenderertext,
gchar *path, gchar *new_text, KbData *kbdata)
{
if (path != NULL && new_text != NULL)
{
GtkTreeIter iter;
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(kbdata->store), &iter, path);
if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(kbdata->store), &iter))
return; /* ignore group items */
kb_change_iter_shortcut(kbdata, &iter, new_text);
}
}
static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *event, GtkLabel *label)
{
gchar *str;
guint state;
g_return_val_if_fail(GTK_IS_LABEL(label), FALSE);
state = event->state & gtk_accelerator_get_default_mod_mask();
if (event->keyval == GDK_Escape)
return FALSE; /* close the dialog, don't allow escape when detecting keybindings. */
str = gtk_accelerator_name(event->keyval, state);
gtk_label_set_text(label, str);
g_free(str);
return TRUE;
}
/* test if the entered key combination is already used
* returns true if cancelling duplicate */
static gboolean kb_find_duplicate(GtkTreeStore *store, GtkWidget *parent, GtkTreeIter *old_iter,
guint key, GdkModifierType mods, const gchar *shortcut)
{
GtkTreeModel *model = GTK_TREE_MODEL(store);
GtkTreeIter parent_iter;
gchar *kb_str;
guint kb_key;
GdkModifierType kb_mods;
/* allow duplicate if there is no key combination */
if (key == 0 && mods == 0)
return FALSE;
/* don't check if the new keybinding is the same as the old one */
gtk_tree_model_get(model, old_iter, KB_TREE_SHORTCUT, &kb_str, -1);
if (kb_str)
{
gtk_accelerator_parse(kb_str, &kb_key, &kb_mods);
g_free(kb_str);
if (key == kb_key && mods == kb_mods)
return FALSE;
}
if (! gtk_tree_model_get_iter_first(model, &parent_iter))
return FALSE;
do /* foreach top level */
{
GtkTreeIter iter;
if (! gtk_tree_model_iter_children(model, &iter, &parent_iter))
continue;
do /* foreach children */
{
gtk_tree_model_get(model, &iter, KB_TREE_SHORTCUT, &kb_str, -1);
if (! kb_str)
continue;
gtk_accelerator_parse(kb_str, &kb_key, &kb_mods);
g_free(kb_str);
/* search another item with the same key and modifiers */
if (kb_key == key && kb_mods == mods)
{
gchar *label;
gint ret;
gtk_tree_model_get(model, &iter, KB_TREE_ACTION, &label, -1);
ret = dialogs_show_prompt(parent,
_("_Allow"), GTK_RESPONSE_APPLY,
GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
_("_Override"), GTK_RESPONSE_YES,
_("Override that keybinding?"),
_("The combination '%s' is already used for \"%s\"."),
shortcut, label);
g_free(label);
if (ret == GTK_RESPONSE_YES)
{
kb_set_shortcut(store, &iter, 0, 0); /* clear shortcut */
/* carry on looking for other duplicates if overriding */
continue;
}
return ret == GTK_RESPONSE_NO;
}
}
while (gtk_tree_model_iter_next(model, &iter));
}
while (gtk_tree_model_iter_next(model, &parent_iter));
return FALSE;
}
static void on_toolbar_show_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(
ui_lookup_widget(ui_widgets.prefs_dialog, "frame_toolbar_style"), sens);
gtk_widget_set_sensitive(
ui_lookup_widget(ui_widgets.prefs_dialog, "frame_toolbar_icon"), sens);
gtk_widget_set_sensitive(
ui_lookup_widget(ui_widgets.prefs_dialog, "button_customize_toolbar"), sens);
gtk_widget_set_sensitive(
ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_in_menu"), sens);
}
static void on_show_notebook_tabs_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
/* tab placement only enabled when tabs are visible */
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "combo_tab_editor"), sens);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_tab_cross"), sens);
}
static void on_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_unfold_children"), sens);
}
static void on_enable_plugins_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "extra_plugin_path_entry"), sens);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "extra_plugin_path_button"), sens);
}
static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "eventbox3"), sens);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "label_open_encoding"), sens);
}
static void on_sidebar_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles"), sens);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_symbol"), sens);
}
static void on_prefs_print_radio_button_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "vbox29"), sens);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "hbox9"), ! sens);
}
static void on_prefs_print_page_header_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_basename"), sens);
gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_print_dateformat"), sens);
}
static void open_preferences_help(void)
{
gchar *uri;
const gchar *label, *suffix = NULL;
GtkNotebook *notebook = GTK_NOTEBOOK(
ui_lookup_widget(ui_widgets.prefs_dialog, "notebook2"));
gint page_nr = gtk_notebook_get_current_page(notebook);
GtkWidget *page = gtk_notebook_get_nth_page(notebook, page_nr);
label = gtk_notebook_get_tab_label_text(notebook, page);
/* TODO Find a better way to map the current notebook page to the
* corresponding chapter in the documentation, comparing translatable
* strings is easy to break. Maybe attach an identifying string to the
* tab label object. */
if (utils_str_equal(label, _("General")))
suffix = "#general-startup-preferences";
else if (utils_str_equal(label, _("Interface")))
suffix = "#interface-preferences";
else if (utils_str_equal(label, _("Toolbar")))
suffix = "#toolbar-preferences";
else if (utils_str_equal(label, _("Editor")))
suffix = "#editor-features-preferences";
else if (utils_str_equal(label, _("Files")))
suffix = "#files-preferences";
else if (utils_str_equal(label, _("Tools")))
suffix = "#tools-preferences";
else if (utils_str_equal(label, _("Templates")))
suffix = "#template-preferences";
else if (utils_str_equal(label, _("Keybindings")))
suffix = "#keybinding-preferences";
else if (utils_str_equal(label, _("Printing")))
suffix = "#printing-preferences";
else if (utils_str_equal(label, _("Various")))
suffix = "#various-preferences";
else if (utils_str_equal(label, _("Terminal")))
suffix = "#terminal-vte-preferences";
uri = utils_get_help_url(suffix);
utils_open_browser(uri);
g_free(uri);
}
static gboolean prefs_dialog_key_press_response_cb(GtkWidget *dialog, GdkEventKey *event,
gpointer data)
{
GeanyKeyBinding *kb = keybindings_lookup_item(GEANY_KEY_GROUP_HELP, GEANY_KEYS_HELP_HELP);
if (keybindings_check_event(event, kb))
{
open_preferences_help();
return TRUE;
}
return FALSE;
}
static void list_store_append_text(GtkListStore *list, const gchar *text)
{
GtkTreeIter iter;
gtk_list_store_append(list, &iter);
gtk_list_store_set(list, &iter, 0, text, -1);
}
void prefs_show_dialog(void)
{
if (ui_widgets.prefs_dialog == NULL)
{
GtkListStore *eol_list;
GtkWidget *label;
ui_widgets.prefs_dialog = create_prefs_dialog();
gtk_widget_set_name(ui_widgets.prefs_dialog, "GeanyPrefsDialog");
gtk_window_set_transient_for(GTK_WINDOW(ui_widgets.prefs_dialog), GTK_WINDOW(main_widgets.window));
/* init the file encoding combo boxes */
{
struct {
const gchar *combo, *renderer;
} names[] = {
{ "combo_new_encoding", "combo_new_encoding_renderer" },
{ "combo_open_encoding", "combo_open_encoding_renderer" }
};
guint i;
GtkTreeStore *encoding_list = encodings_encoding_store_new(FALSE);
for (i = 0; i < G_N_ELEMENTS(names); i++)
{
GtkWidget *combo = ui_lookup_widget(ui_widgets.prefs_dialog, names[i].combo);
gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo),
ui_builder_get_object(names[i].renderer),
encodings_encoding_store_cell_data_func, NULL, NULL);
gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(encoding_list));
}
g_object_unref(encoding_list);
}
/* init the eol character combo box */
eol_list = ui_builder_get_object("eol_list");
list_store_append_text(eol_list, utils_get_eol_name(SC_EOL_CRLF));
list_store_append_text(eol_list, utils_get_eol_name(SC_EOL_CR));
list_store_append_text(eol_list, utils_get_eol_name(SC_EOL_LF));
/* add manually GeanyWrapLabels because they can't be added with Glade */
/* page Tools */
label = geany_wrap_label_new(_("Enter tool paths below. Tools you do not need can be left blank."));
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(ui_lookup_widget(ui_widgets.prefs_dialog, "vbox33")),
label, FALSE, TRUE, 5);
/* page Templates */
label = geany_wrap_label_new(_("Set the information to be used in templates. See the documentation for details."));
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(ui_lookup_widget(ui_widgets.prefs_dialog, "vbox31")),
label, FALSE, TRUE, 5);
/* page Keybindings */
label = geany_wrap_label_new(_("Here you can change keyboard shortcuts for various actions. Select one and press the Change button to enter a new shortcut, or double click on an action to edit the string representation of the shortcut directly."));
gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(ui_lookup_widget(ui_widgets.prefs_dialog, "vbox32")),
label, FALSE, TRUE, 5);
/* page Editor->Indentation */
label = geany_wrap_label_new(_("<i>Warning: these settings are overridden by the current project. See <b>Project->Properties</b>.</i>"));
gtk_widget_show(label);
gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
gtk_misc_set_padding(GTK_MISC(label), 6, 0);
gtk_box_pack_start(GTK_BOX(ui_lookup_widget(ui_widgets.prefs_dialog,
"label_project_indent_warning")), label, FALSE, TRUE, 5);
/* add the clear icon to GtkEntry widgets in the dialog */
{
const gchar *names[] = {
"startup_path_entry",
"project_file_path_entry",
"extra_plugin_path_entry",
"entry_toggle_mark",
/* "entry_com_make", */
"entry_com_term",
"entry_browser",
"entry_grep",
"entry_contextaction",
"entry_template_developer",
"entry_template_initial",
"entry_template_mail",
"entry_template_company",
"entry_template_version",
"entry_template_year",
"entry_template_date",
"entry_template_datetime",
"entry_print_external_cmd",
"entry_print_dateformat"};
const gchar **name;
foreach_c_array(name, names, G_N_ELEMENTS(names))
ui_entry_add_clear_icon(GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, *name)));
}
/* page Various */
various_treeview = GTK_TREE_VIEW(ui_lookup_widget(ui_widgets.prefs_dialog,
"various_treeview"));
stash_tree_setup(pref_groups, various_treeview);
#ifdef HAVE_VTE
vte_append_preferences_tab();
#endif
#ifndef G_OS_WIN32
gtk_widget_hide(ui_lookup_widget(ui_widgets.prefs_dialog, "check_native_windows_dialogs"));
#endif
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "startup_path_button"), NULL,
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "startup_path_entry")));
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "extra_plugin_path_button"), NULL,
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "extra_plugin_path_entry")));
g_signal_connect(ui_widgets.prefs_dialog, "response",
G_CALLBACK(on_prefs_dialog_response), NULL);
g_signal_connect(ui_widgets.prefs_dialog, "delete-event",
G_CALLBACK(gtk_widget_hide_on_delete), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "tagbar_font"),
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(1));
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "msgwin_font"),
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(2));
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "editor_font"),
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(3));
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "long_line_color"),
"color-set", G_CALLBACK(on_color_button_choose_cb), NULL);
/* file chooser buttons in the tools tab */
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_term"),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_com_term")));
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_browser"),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_browser")));
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_grep"),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_grep")));
/* tools commands */
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_contextaction"),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction")));
/* printing */
ui_setup_open_button_callback(ui_lookup_widget(ui_widgets.prefs_dialog, "button_print_external_cmd"),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_ENTRY(ui_lookup_widget(ui_widgets.prefs_dialog, "entry_print_external_cmd")));
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "radio_print_gtk"),
"toggled", G_CALLBACK(on_prefs_print_radio_button_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_print_pageheader"),
"toggled", G_CALLBACK(on_prefs_print_page_header_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_plugins"),
"toggled", G_CALLBACK(on_enable_plugins_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show"),
"toggled", G_CALLBACK(on_toolbar_show_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs"),
"toggled", G_CALLBACK(on_show_notebook_tabs_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_folding"),
"toggled", G_CALLBACK(on_use_folding_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding"),
"toggled", G_CALLBACK(on_open_encoding_toggled), NULL);
g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_sidebar_visible"),
"toggled", G_CALLBACK(on_sidebar_visible_toggled), NULL);
g_signal_connect(ui_widgets.prefs_dialog,
"key-press-event", G_CALLBACK(prefs_dialog_key_press_response_cb), NULL);
}
prefs_init_dialog();
gtk_window_present(GTK_WINDOW(ui_widgets.prefs_dialog));
}