geany/src/prefs.c
Nick Treleaven ef1399e000 Rename MyApp -> GeanyApp.
Move most GeanyApp fields into:
GeanyPrefs for (most) Preferences dialog fields;
UIPrefs for non-Prefs dialog visual settings;
UIWidgets for less commonly used widgets such as menuitems and
dialogs;
GeanyStatus for various states the application can be in.
Move some GeanyApp fields into EditorPrefs (and one into each of
CommandLineOptions and SidebarTreeviews).
Add plugin API prefs field.
Move disabling build widgets on Windows to build_init().
Make build callbacks static.
Add treeviews_init() to prepare popup menus and open files treeview.
Replace treeviews_find_node() with treeviews_select_openfiles_item().
Make utils_isbrace() and utils_is_opening_brace() take an
'include_angles' argument (to separate from editor_prefs).
Make 'Goto matching brace' keybinding include <> angle brackets.


git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@1815 ea778897-0a13-0410-b9d1-a72fbfd435f5
2007-08-23 11:34:06 +00:00

1243 lines
48 KiB
C

/*
* prefs.c - this file is part of Geany, a fast and lightweight IDE
*
* Copyright 2005-2007 Enrico Tröger <enrico.troeger@uvena.de>
* Copyright 2006-2007 Nick Treleaven <nick.treleaven@btinternet.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.
*
* 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.
*
* $Id$
*/
/*
* Preferences dialog support functions.
*/
#include <stdlib.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
#include "geany.h"
#include "prefs.h"
#include "support.h"
#include "dialogs.h"
#include "ui_utils.h"
#include "utils.h"
#include "msgwindow.h"
#include "sciwrappers.h"
#include "document.h"
#include "keyfile.h"
#include "keybindings.h"
#include "interface.h"
#include "encodings.h"
#include "project.h"
#include "editor.h"
#include "main.h"
#include "treeviews.h"
#ifdef HAVE_VTE
# include "vte.h"
#endif
#ifdef G_OS_WIN32
# include "win32.h"
#endif
GeanyPrefs prefs;
static gchar *dialog_key_name;
static GtkTreeIter g_iter;
static GtkTreeStore *store = NULL;
static GtkTreeView *tree = NULL;
static GtkWidget *dialog_label;
static gboolean edited = FALSE;
static gboolean on_tree_view_button_press_event(
GtkWidget *widget, GdkEventButton *event, gpointer user_data);
static void on_cell_edited(GtkCellRendererText *cellrenderertext, gchar *path, gchar *new_text, gpointer user_data);
static gboolean on_keytype_dialog_response(GtkWidget *dialog, GdkEventKey *event, gpointer user_data);
static void on_dialog_response(GtkWidget *dialog, gint response, gpointer user_data);
static gboolean find_duplicate(guint idx, guint key, GdkModifierType mods, const gchar *action);
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_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_symbol_auto_completion_toggled(GtkToggleButton *togglebutton, gpointer user_data);
static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data);
void prefs_init_dialog(void)
{
GtkWidget *widget;
GdkColor *color;
// General settings
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_mru");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), prefs.mru_length);
// startup
widget = lookup_widget(ui_widgets.prefs_dialog, "check_load_session");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.load_session);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_save_win_pos");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.save_winpos);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_plugins");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.load_plugins);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_ask_for_quit");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.confirm_exit);
// behaviour
widget = lookup_widget(ui_widgets.prefs_dialog, "check_beep");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.beep_on_errors);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_switch_pages");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.switch_msgwin_pages);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_suppress_status_msgs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.suppress_status_messages);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_auto_focus");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.auto_focus);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_ask_suppress_search_dialogs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.suppress_search_dialogs);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.context_action_cmd);
widget = lookup_widget(ui_widgets.prefs_dialog, "startup_path_entry");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.default_open_path);
project_setup_prefs(); // project files path
// Interface settings
widget = lookup_widget(ui_widgets.prefs_dialog, "check_list_symbol");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.sidebar_symbol_visible);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.sidebar_openfiles_visible);
widget = lookup_widget(ui_widgets.prefs_dialog, "tagbar_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), prefs.tagbar_font);
widget = lookup_widget(ui_widgets.prefs_dialog, "msgwin_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), prefs.msgwin_font);
widget = lookup_widget(ui_widgets.prefs_dialog, "editor_font");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), prefs.editor_font);
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_long_line");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.long_line_column);
switch (editor_prefs.long_line_type)
{
case 0: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_line"); break;
case 1: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_background"); break;
default: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_disabled"); break;
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
color = g_new0(GdkColor, 1);
gdk_color_parse(editor_prefs.long_line_color, color);
widget = lookup_widget(ui_widgets.prefs_dialog, "long_line_color");
gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), color);
g_free(color);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.show_notebook_tabs);
// disable following setting if notebook tabs are hidden
on_show_notebook_tabs_toggled(GTK_TOGGLE_BUTTON(
lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs")), NULL);
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_tab_editor");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), prefs.tab_pos_editor);
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_tab_msgwin");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), prefs.tab_pos_msgwin);
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_tab_sidebar");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), prefs.tab_pos_sidebar);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_statusbar_visible");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.statusbar_visible);
// Toolbar settings
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_visible);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_search");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_search);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_goto");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_goto);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_compile");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_compile);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_zoom");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_zoom);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_undo");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_undo);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_navigation");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_navigation);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_colour");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_colour);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_fileops");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_fileops);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_quit");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.toolbar_show_quit);
switch (prefs.toolbar_icon_style)
{
case 0: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_image"); break;
case 1: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_text"); break;
default: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_imagetext"); break;
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
switch (prefs.toolbar_icon_size)
{
case GTK_ICON_SIZE_LARGE_TOOLBAR:
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_large"); break;
default: widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_small"); break;
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
// disable elements if toolbar is hidden
on_toolbar_show_toggled(GTK_TOGGLE_BUTTON(
lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show")), NULL);
// Files settings
if (prefs.tab_order_ltr)
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_tab_right");
else
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_tab_left");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
// Editor settings
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_tab_width");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.tab_width);
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
// luckily the index of the combo box items match the index of the encodings array
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), editor_prefs.default_new_encoding);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
(editor_prefs.default_open_encoding >= 0) ? TRUE : FALSE);
on_open_encoding_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
if (editor_prefs.default_open_encoding >= 0)
{
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), editor_prefs.default_open_encoding);
}
else
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), GEANY_ENCODING_UTF_8);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_trailing_spaces");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.trail_space);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_new_line");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.new_line);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_replace_tabs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.replace_tabs);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_indent");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_indent_guide);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_white_space");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_white_space);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_line_end");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.show_line_endings);
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_auto_indent_mode");
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), editor_prefs.indent_mode);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_line_wrapping");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.line_breaking);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_auto_complete");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.auto_complete_constructs);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_xmltag");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.auto_close_xml_tags);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_folding");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.folding);
widget = 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(
lookup_widget(ui_widgets.prefs_dialog, "check_folding")), NULL);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_disable_dnd");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.disable_dnd);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_smart_home");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.smart_home_key);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_use_tabs");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.use_tabs);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_indicators");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.use_indicators);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_symbol_auto_completion");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), editor_prefs.auto_complete_symbols);
on_symbol_auto_completion_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_autocheight");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), editor_prefs.autocompletion_max_height);
// Tools Settings
#ifdef G_OS_WIN32
// hide related Make path setting
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "label11"), FALSE);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "entry_com_make"), FALSE);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "button_make"), FALSE);
#else
if (prefs.tools_make_cmd)
gtk_entry_set_text(GTK_ENTRY(lookup_widget(ui_widgets.prefs_dialog, "entry_com_make")), prefs.tools_make_cmd);
#endif
if (prefs.tools_term_cmd)
gtk_entry_set_text(GTK_ENTRY(lookup_widget(ui_widgets.prefs_dialog, "entry_com_term")), prefs.tools_term_cmd);
if (prefs.tools_browser_cmd)
gtk_entry_set_text(GTK_ENTRY(lookup_widget(ui_widgets.prefs_dialog, "entry_browser")), prefs.tools_browser_cmd);
if (prefs.tools_print_cmd)
gtk_entry_set_text(GTK_ENTRY(lookup_widget(ui_widgets.prefs_dialog, "entry_print")), prefs.tools_print_cmd);
if (prefs.tools_grep_cmd)
gtk_entry_set_text(GTK_ENTRY(lookup_widget(ui_widgets.prefs_dialog, "entry_grep")), prefs.tools_grep_cmd);
// Template settings
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_developer");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.template_developer);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_company");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.template_company);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_mail");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.template_mail);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_initial");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.template_initial);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_version");
gtk_entry_set_text(GTK_ENTRY(widget), prefs.template_version);
// Keybindings
if (store == NULL)
{
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
tree = GTK_TREE_VIEW(lookup_widget(ui_widgets.prefs_dialog, "treeview7"));
//g_object_set(tree, "vertical-separator", 6, NULL);
store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Action"), renderer, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
renderer = gtk_cell_renderer_text_new();
g_object_set(renderer, "editable", TRUE, NULL);
column = gtk_tree_view_column_new_with_attributes(_("Shortcut"), renderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
// set policy settings for the scollwedwindow around the treeview again, because glade
// doesn't keep the settings
gtk_scrolled_window_set_policy(
GTK_SCROLLED_WINDOW(lookup_widget(ui_widgets.prefs_dialog, "scrolledwindow8")),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(on_cell_edited), NULL);
g_signal_connect(G_OBJECT(tree), "button-press-event",
G_CALLBACK(on_tree_view_button_press_event), NULL);
g_signal_connect(G_OBJECT(lookup_widget(ui_widgets.prefs_dialog, "button2")), "clicked",
G_CALLBACK(on_tree_view_button_press_event), NULL);
}
{
GtkTreeIter parent, iter;
gint i;
gchar *key_string;
for (i = 0; i < GEANY_MAX_KEYS; i++)
{
if (keys[i]->section != NULL)
{
gtk_tree_store_append(store, &parent, NULL);
gtk_tree_store_set(store, &parent, 0, keys[i]->section, -1);
}
key_string = gtk_accelerator_name(keys[i]->key, keys[i]->mods);
gtk_tree_store_append(store, &iter, &parent);
gtk_tree_store_set(store, &iter, 0, keys[i]->label, 1, key_string, -1);
g_free(key_string);
}
}
gtk_tree_view_expand_all(GTK_TREE_VIEW(tree));
#ifndef HAVE_PLUGINS
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "check_plugins"), FALSE);
#endif
#ifdef HAVE_VTE
// make VTE switch visible only when VTE is compiled in, it is hidden by default
widget = 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 = lookup_widget(ui_widgets.prefs_dialog, "font_term");
gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), vc->font);
widget = lookup_widget(ui_widgets.prefs_dialog, "color_fore");
gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), vc->colour_fore);
widget = lookup_widget(ui_widgets.prefs_dialog, "color_back");
gtk_color_button_set_color(GTK_COLOR_BUTTON(widget), vc->colour_back);
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_scrollback");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), vc->scrollback_lines);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_emulation");
gtk_entry_set_text(GTK_ENTRY(widget), vc->emulation);
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_shell");
gtk_entry_set_text(GTK_ENTRY(widget), vc->shell);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_scroll_key");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->scroll_on_key);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_scroll_out");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->scroll_on_out);
widget = 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 = lookup_widget(ui_widgets.prefs_dialog, "check_follow_path");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->follow_path);
widget = lookup_widget(ui_widgets.prefs_dialog, "check_run_in_vte");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->run_in_vte);
}
#endif
}
/*
* callbacks
*/
static void
on_prefs_button_clicked(GtkDialog *dialog, gint response, gpointer user_data)
{
if (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY)
{
GtkWidget *widget;
guint i;
// General settings
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_mru");
prefs.mru_length = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
// startup
widget = lookup_widget(ui_widgets.prefs_dialog, "check_load_session");
prefs.load_session = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_save_win_pos");
prefs.save_winpos = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_plugins");
prefs.load_plugins = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_ask_for_quit");
prefs.confirm_exit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
// behaviour
widget = lookup_widget(ui_widgets.prefs_dialog, "check_beep");
prefs.beep_on_errors = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_ask_suppress_search_dialogs");
prefs.suppress_search_dialogs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_switch_pages");
prefs.switch_msgwin_pages = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_suppress_status_msgs");
prefs.suppress_status_messages = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_auto_focus");
prefs.auto_focus = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction");
g_free(prefs.context_action_cmd);
prefs.context_action_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "startup_path_entry");
g_free(prefs.default_open_path);
prefs.default_open_path = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
project_apply_prefs(); // project file path
// Interface settings
widget = lookup_widget(ui_widgets.prefs_dialog, "check_list_symbol");
prefs.sidebar_symbol_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles");
prefs.sidebar_openfiles_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = 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
{
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_background");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) editor_prefs.long_line_type = 1;
else
{ // now only the disabled radio remains, so disable it
editor_prefs.long_line_type = 2;
}
}
if (editor_prefs.long_line_column == 0) editor_prefs.long_line_type = 2;
widget = lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs");
prefs.show_notebook_tabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_tab_editor");
prefs.tab_pos_editor = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_tab_msgwin");
prefs.tab_pos_msgwin = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_tab_sidebar");
prefs.tab_pos_sidebar = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_statusbar_visible");
prefs.statusbar_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
// Toolbar settings
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show");
prefs.toolbar_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_search");
prefs.toolbar_show_search = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_goto");
prefs.toolbar_show_goto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_zoom");
prefs.toolbar_show_zoom = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_undo");
prefs.toolbar_show_undo = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_navigation");
prefs.toolbar_show_navigation = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_compile");
prefs.toolbar_show_compile = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_colour");
prefs.toolbar_show_colour = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_fileops");
prefs.toolbar_show_fileops = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_quit");
prefs.toolbar_show_quit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_imagetext");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) prefs.toolbar_icon_style = 2;
else
{
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_image");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
prefs.toolbar_icon_style = 0;
else
// now only the text only radio remains, so set text only
prefs.toolbar_icon_style = 1;
}
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_toolbar_large");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
prefs.toolbar_icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR;
else
prefs.toolbar_icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR;
// Files settings
widget = lookup_widget(ui_widgets.prefs_dialog, "radio_tab_right");
prefs.tab_order_ltr = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
// Editor settings
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_tab_width");
editor_prefs.tab_width = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
editor_prefs.default_new_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
{
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
editor_prefs.default_open_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
}
else
editor_prefs.default_open_encoding = -1;
widget = lookup_widget(ui_widgets.prefs_dialog, "check_trailing_spaces");
editor_prefs.trail_space = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_new_line");
editor_prefs.new_line = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_replace_tabs");
editor_prefs.replace_tabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "spin_long_line");
editor_prefs.long_line_column = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = 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 = lookup_widget(ui_widgets.prefs_dialog, "check_unfold_children");
editor_prefs.unfold_all_children = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_indent");
editor_prefs.show_indent_guide = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_white_space");
editor_prefs.show_white_space = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_line_end");
editor_prefs.show_line_endings = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "combo_auto_indent_mode");
editor_prefs.indent_mode = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_line_wrapping");
editor_prefs.line_breaking = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_auto_complete");
editor_prefs.auto_complete_constructs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_xmltag");
editor_prefs.auto_close_xml_tags = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_indicators");
editor_prefs.use_indicators = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_disable_dnd");
editor_prefs.disable_dnd = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_smart_home");
editor_prefs.smart_home_key = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_use_tabs");
editor_prefs.use_tabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = 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 = lookup_widget(ui_widgets.prefs_dialog, "spin_autocheight");
editor_prefs.autocompletion_max_height = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
// Tools Settings
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_com_make");
g_free(prefs.tools_make_cmd);
prefs.tools_make_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_com_term");
g_free(prefs.tools_term_cmd);
prefs.tools_term_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_browser");
g_free(prefs.tools_browser_cmd);
prefs.tools_browser_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_print");
g_free(prefs.tools_print_cmd);
prefs.tools_print_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_grep");
g_free(prefs.tools_grep_cmd);
prefs.tools_grep_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
// Template settings
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_developer");
g_free(prefs.template_developer);
prefs.template_developer = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_company");
g_free(prefs.template_company);
prefs.template_company = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_mail");
g_free(prefs.template_mail);
prefs.template_mail = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_initial");
g_free(prefs.template_initial);
prefs.template_initial = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_template_version");
g_free(prefs.template_version);
prefs.template_version = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
// Keybindings
if (edited) keybindings_write_to_file();
#ifdef HAVE_VTE
widget = 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 = lookup_widget(ui_widgets.prefs_dialog, "spin_scrollback");
vc->scrollback_lines = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_emulation");
g_free(vc->emulation);
vc->emulation = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "entry_shell");
g_free(vc->shell);
vc->shell = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_scroll_key");
vc->scroll_on_key = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_scroll_out");
vc->scroll_on_out = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = 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 = lookup_widget(ui_widgets.prefs_dialog, "check_follow_path");
vc->follow_path = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
widget = lookup_widget(ui_widgets.prefs_dialog, "check_run_in_vte");
vc->run_in_vte = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
vte_apply_user_settings();
}
#endif
// apply the changes made
ui_statusbar_showhide(prefs.statusbar_visible);
ui_update_toolbar_items();
ui_update_toolbar_icons(prefs.toolbar_icon_size);
gtk_toolbar_set_style(GTK_TOOLBAR(app->toolbar), prefs.toolbar_icon_style);
ui_treeviews_show_hide(FALSE);
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(app->notebook), prefs.show_notebook_tabs);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(app->notebook), prefs.tab_pos_editor);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(msgwindow.notebook), prefs.tab_pos_msgwin);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(app->treeview_notebook), prefs.tab_pos_sidebar);
// re-colourise all open documents, if tab width or long line settings have changed
for (i = 0; i < doc_array->len; i++)
{
if (doc_list[i].is_valid)
{
document_apply_update_prefs(i);
if (! editor_prefs.folding)
document_unfold_all(i);
}
}
ui_document_show_hide(-1);
// store all settings
configuration_save();
}
if (response != GTK_RESPONSE_APPLY)
{
gtk_tree_store_clear(store);
gtk_widget_hide(GTK_WIDGET(dialog));
}
}
void on_prefs_color_choosed(GtkColorButton *widget, gpointer user_data)
{
GdkColor color;
switch (GPOINTER_TO_INT(user_data))
{
case 1:
{
gtk_color_button_get_color(widget, &color);
editor_prefs.long_line_color = utils_get_hex_from_color(&color);
break;
}
#ifdef HAVE_VTE
case 2:
{
g_free(vc->colour_fore);
vc->colour_fore = g_new0(GdkColor, 1);
gtk_color_button_get_color(widget, vc->colour_fore);
break;
}
case 3:
{
g_free(vc->colour_back);
vc->colour_back = g_new0(GdkColor, 1);
gtk_color_button_get_color(widget, vc->colour_back);
break;
}
#endif
}
}
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, prefs.tagbar_font) == 0) break;
g_free(prefs.tagbar_font);
prefs.tagbar_font = g_strdup(fontbtn);
for (i = 0; i < doc_array->len; i++)
{
if (doc_list[i].is_valid && GTK_IS_WIDGET(doc_list[i].tag_tree))
ui_widget_modify_font_from_string(doc_list[i].tag_tree,
prefs.tagbar_font);
}
if (GTK_IS_WIDGET(tv.default_tag_tree))
ui_widget_modify_font_from_string(tv.default_tag_tree, prefs.tagbar_font);
ui_widget_modify_font_from_string(lookup_widget(app->window, "entry1"),
prefs.tagbar_font);
break;
}
case 2:
{
if (strcmp(fontbtn, prefs.msgwin_font) == 0) break;
g_free(prefs.msgwin_font);
prefs.msgwin_font = g_strdup(fontbtn);
ui_widget_modify_font_from_string(msgwindow.tree_compiler, prefs.msgwin_font);
ui_widget_modify_font_from_string(msgwindow.tree_msg, prefs.msgwin_font);
ui_widget_modify_font_from_string(msgwindow.tree_status, prefs.msgwin_font);
break;
}
case 3:
{
ui_set_editor_font(fontbtn);
break;
}
#ifdef HAVE_VTE
case 4:
{
// VTE settings
if (strcmp(fontbtn, vc->font) == 0) break;
g_free(vc->font);
vc->font = g_strdup(gtk_font_button_get_font_name(widget));
vte_apply_user_settings();
break;
}
#endif
}
}
static gboolean on_tree_view_button_press_event(
GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
GtkTreeModel *model;
GtkTreeSelection *selection;
gchar *name;
// discard click events in the tree unless it is a double click
if (widget == (GtkWidget*)tree && event->type != GDK_2BUTTON_PRESS)
return FALSE;
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
if (gtk_tree_selection_get_selected(selection, &model, &g_iter))
{
if (gtk_tree_model_iter_has_child(model, &g_iter))
{ // double click on a section to expand or collapse it
GtkTreePath *path = gtk_tree_model_get_path(model, &g_iter);
if (gtk_tree_view_row_expanded(tree, path))
gtk_tree_view_collapse_row(tree, path);
else
gtk_tree_view_expand_row(tree, path, FALSE);
gtk_tree_path_free(path);
return TRUE;
}
gtk_tree_model_get(model, &g_iter, 0, &name, -1);
if (name != NULL)
{
GtkWidget *dialog;
GtkWidget *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(
_("Type 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);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
dialog_label = gtk_label_new("");
gtk_misc_set_padding(GTK_MISC(dialog_label), 5, 10);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), dialog_label);
g_signal_connect(G_OBJECT(dialog), "key-press-event",
G_CALLBACK(on_keytype_dialog_response), NULL);
g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(on_dialog_response), NULL);
// copy name to global variable to hold it, will be freed in on_dialog_response()
dialog_key_name = g_strdup(name);
gtk_widget_show_all(dialog);
g_free(str);
g_free(name);
}
}
return TRUE;
}
static void on_cell_edited(GtkCellRendererText *cellrenderertext, gchar *path, gchar *new_text, gpointer user_data)
{
if (path != NULL && new_text != NULL)
{
guint idx;
guint lkey;
GdkModifierType lmods;
gchar *test;
GtkTreeIter iter;
// get the index of the shortcut
idx = strtol(path, &test, 10);
if (test == path)
return;
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(store), &iter, path);
if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(store), &iter))
return;
gtk_accelerator_parse(new_text, &lkey, &lmods);
if (find_duplicate(idx, 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
keys[idx]->key = lkey;
keys[idx]->mods = lmods;
gtk_tree_store_set(store, &iter, 1, new_text, -1);
edited = TRUE;
}
}
static gboolean on_keytype_dialog_response(GtkWidget *dialog, GdkEventKey *event, gpointer user_data)
{
gchar *str;
if (event->state == 0 && event->keyval == GDK_Escape)
return FALSE; // close the dialog, don't allow escape when detecting keybindings.
// ignore numlock key, not necessary but nice
if (event->state & GDK_MOD2_MASK) event->state -= GDK_MOD2_MASK;
str = gtk_accelerator_name(event->keyval, event->state);
gtk_label_set_text(GTK_LABEL(dialog_label), str);
g_free(str);
return TRUE;
}
static void on_dialog_response(GtkWidget *dialog, gint response, gpointer iter)
{
if (response == GTK_RESPONSE_ACCEPT)
{
guint idx;
guint lkey;
GdkModifierType lmods;
for (idx = 0; idx < GEANY_MAX_KEYS; idx++)
{
if (utils_str_equal(dialog_key_name, keys[idx]->label)) break;
}
gtk_accelerator_parse(gtk_label_get_text(GTK_LABEL(dialog_label)), &lkey, &lmods);
if (find_duplicate(idx, lkey, lmods, gtk_label_get_text(GTK_LABEL(dialog_label))))
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
keys[idx]->key = lkey;
keys[idx]->mods = lmods;
gtk_tree_store_set(store, &g_iter,
1, gtk_label_get_text(GTK_LABEL(dialog_label)), -1);
g_free(dialog_key_name);
dialog_key_name = NULL;
edited = TRUE;
}
gtk_widget_destroy(dialog);
}
// test if the entered key combination is already used
static gboolean find_duplicate(guint idx, guint key, GdkModifierType mods, const gchar *action)
{
guint i;
// allow duplicate if there is no key combination
if (key == 0 && mods == 0) return FALSE;
for (i = 0; i < GEANY_MAX_KEYS; i++)
{
// search another item with the same key, but take not the key we are searching for(-> idx)
if (keys[i]->key == key && keys[i]->mods == mods
&& ! (keys[i]->key == keys[idx]->key && keys[i]->mods == keys[idx]->mods))
{
dialogs_show_msgbox(GTK_MESSAGE_ERROR,
_("The combination '%s' is already used for \"%s\". Please choose another one."),
action, keys[i]->label);
return TRUE;
}
}
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(lookup_widget(ui_widgets.prefs_dialog, "frame11"), sens);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "frame13"), 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(lookup_widget(ui_widgets.prefs_dialog, "combo_tab_editor"), sens);
}
static void on_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "check_unfold_children"), sens);
}
static void on_symbol_auto_completion_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "hbox6"), sens);
}
static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data)
{
gboolean sens = gtk_toggle_button_get_active(togglebutton);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "eventbox3"), sens);
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "label_open_encoding"), sens);
}
void prefs_show_dialog(void)
{
if (ui_widgets.prefs_dialog == NULL)
{
GtkWidget *combo_new, *combo_open;
guint i;
gchar *encoding_string;
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(app->window));
// init the default file encoding combo box
combo_new = lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
combo_open = lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo_new), 3);
gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo_open), 3);
for (i = 0; i < GEANY_ENCODINGS_MAX; i++)
{
encoding_string = encodings_to_string(&encodings[i]);
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_new), encoding_string);
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_open), encoding_string);
g_free(encoding_string);
}
#ifdef HAVE_VTE
vte_append_preferences_tab();
#endif
ui_setup_open_button_callback(lookup_widget(ui_widgets.prefs_dialog, "startup_path_button"), NULL,
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_ENTRY(lookup_widget(ui_widgets.prefs_dialog, "startup_path_entry")));
g_signal_connect((gpointer) ui_widgets.prefs_dialog, "response",
G_CALLBACK(on_prefs_button_clicked), NULL);
g_signal_connect((gpointer) ui_widgets.prefs_dialog, "delete_event",
G_CALLBACK(gtk_widget_hide_on_delete), NULL);
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "tagbar_font"),
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(1));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "msgwin_font"),
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(2));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "editor_font"),
"font-set", G_CALLBACK(on_prefs_font_choosed), GINT_TO_POINTER(3));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "long_line_color"),
"color-set", G_CALLBACK(on_prefs_color_choosed), GINT_TO_POINTER(1));
// file chooser buttons in the tools tab
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "button_make"),
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), lookup_widget(ui_widgets.prefs_dialog, "entry_com_make"));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "button_term"),
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), lookup_widget(ui_widgets.prefs_dialog, "entry_com_term"));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "button_browser"),
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), lookup_widget(ui_widgets.prefs_dialog, "entry_browser"));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "button_grep"),
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), lookup_widget(ui_widgets.prefs_dialog, "entry_grep"));
// tools commands
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "button_print"),
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), lookup_widget(ui_widgets.prefs_dialog, "entry_print"));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "button_contextaction"),
"clicked", G_CALLBACK(on_prefs_tools_button_clicked), lookup_widget(ui_widgets.prefs_dialog, "entry_contextaction"));
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "check_toolbar_show"),
"toggled", G_CALLBACK(on_toolbar_show_toggled), NULL);
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "check_show_notebook_tabs"),
"toggled", G_CALLBACK(on_show_notebook_tabs_toggled), NULL);
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "check_folding"),
"toggled", G_CALLBACK(on_use_folding_toggled), NULL);
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "check_symbol_auto_completion"),
"toggled", G_CALLBACK(on_symbol_auto_completion_toggled), NULL);
g_signal_connect((gpointer) lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding"),
"toggled", G_CALLBACK(on_open_encoding_toggled), NULL);
}
prefs_init_dialog();
gtk_widget_show(ui_widgets.prefs_dialog);
}
void
on_prefs_tools_button_clicked (GtkButton *button,
gpointer item)
{
#ifdef G_OS_WIN32
win32_show_pref_file_dialog(item);
#else
GtkWidget *dialog;
gchar *filename, *tmp, **field;
// initialize the dialog
dialog = gtk_file_chooser_dialog_new(_("Open File"), GTK_WINDOW(ui_widgets.prefs_dialog),
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
// cut the options from the command line
field = g_strsplit(gtk_entry_get_text(GTK_ENTRY(item)), " ", 2);
if (field[0])
{
filename = g_find_program_in_path(field[0]);
if (filename)
{
gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(dialog), filename);
g_free(filename);
}
}
// run it
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
{
tmp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
if (g_strv_length(field) > 1)
filename = g_strconcat(tmp, " ", field[1], NULL);
else
{
filename = tmp;
tmp = NULL;
}
gtk_entry_set_text(GTK_ENTRY(item), filename);
g_free(filename);
g_free(tmp);
}
g_strfreev(field);
gtk_widget_destroy(dialog);
#endif
}