1 /*
2 
3 Copyright (c) 2001-2007 Michael Terry
4 Copyright (c) 2013-2014 Arthur Borsboom
5 
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 
20 */
21 
22 #include "../config.h"
23 
24 #include <glib/gi18n.h>
25 #include <gtk/gtk.h>
26 
27 #include "xpad-preferences.h"
28 #include "xpad-app.h"
29 #include "xpad-pad-group.h"
30 
31 struct XpadPreferencesPrivate
32 {
33 	XpadSettings *settings;
34 
35 	GtkWidget *notebook;
36 
37 	GtkWidget *height;
38 	GtkWidget *width;
39 	GtkWidget *fontcheck;
40 	GtkWidget *antifontcheck;
41 	GtkWidget *fontbutton;
42 	GtkWidget *colorcheck;
43 	GtkWidget *anticolorcheck;
44 	GtkWidget *colorbox;
45 	GtkWidget *textbutton;
46 	GtkWidget *backbutton;
47 	GtkWidget *autostart_xpad;
48 	GtkWidget *autostart_wait_systray;
49 	GtkWidget *autostart_delay;
50 	GtkWidget *autostart_new_pad;
51 	GtkWidget *autostart_sticky;
52 	GtkWidget *autostart_display_pads;
53 	GtkWidget *tray_enabled;
54 	GtkWidget *tray_click_configuration;
55 	GtkWidget *editcheck;
56 	GtkWidget *confirmcheck;
57 	GtkWidget *has_decorations;
58 	GtkWidget *hide_from_taskbar;
59 	GtkWidget *hide_from_task_switcher;
60 	GtkWidget *has_toolbar;
61 	GtkWidget *autohide_toolbar;
62 	GtkWidget *has_scrollbar;
63 
64 	gulong fontcheck_handler;
65 	gulong font_handler;
66 	gulong colorcheck_handler;
67 	gulong text_handler;
68 	gulong back_handler;
69 	gulong new_pad_height_handler;
70 	gulong new_pad_width_handler;
71 	gulong autostart_xpad_handler;
72 	gulong autostart_wait_systray_handler;
73 	gulong autostart_delay_handler;
74 	gulong autostart_new_pad_handler;
75 	gulong autostart_sticky_handler;
76 	gulong autostart_display_pads_handler;
77 	gulong tray_enabled_handler;
78 	gulong tray_click_handler;
79 	gulong editcheck_handler;
80 	gulong confirmcheck_handler;
81 	gulong has_decorations_handler;
82 	gulong hide_from_taskbar_handler;
83 	gulong hide_from_task_switcher_handler;
84 	gulong has_toolbar_handler;
85 	gulong autohide_toolbar_handler;
86 	gulong has_scrollbar_handler;
87 
88 	gulong notify_font_handler;
89 	gulong notify_text_handler;
90 	gulong notify_back_handler;
91 	gulong notify_autostart_xpad_handler;
92 	gulong notify_autostart_wait_systray_handler;
93 	gulong notify_autostart_delay_handler;
94 	gulong notify_autostart_new_pad_handler;
95 	gulong notify_autostart_sticky_handler;
96 	gulong notify_autostart_display_pads_handler;
97 	gulong notify_tray_enabled_handler;
98 	gulong notify_tray_click_handler;
99 	gulong notify_edit_handler;
100 	gulong notify_confirm_handler;
101 	gulong notify_has_decorations_handler;
102 	gulong notify_hide_from_taskbar_handler;
103 	gulong notify_hide_from_task_switcher_handler;
104 	gulong notify_has_toolbar_handler;
105 	gulong notify_autohide_toolbar_handler;
106 	gulong notify_has_scrollbar_handler;
107 };
108 
109 G_DEFINE_TYPE_WITH_PRIVATE (XpadPreferences, xpad_preferences, GTK_TYPE_WINDOW)
110 
111 static void xpad_preferences_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
112 static void xpad_preferences_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
113 static void xpad_preferences_constructed (GObject *object);
114 static void xpad_preferences_finalize (GObject *object);
115 
116 static void change_font_check (GtkToggleButton *button, XpadPreferences *pref);
117 static void change_font_face (GtkFontChooser *button, XpadPreferences *pref);
118 static void change_color_check (GtkToggleButton *button, XpadPreferences *pref);
119 static void change_text_color (GtkColorChooser *chooser, XpadPreferences *pref);
120 static void change_back_color (GtkColorChooser *chooser, XpadPreferences *pref);
121 static void change_new_pad_height (GtkSpinButton *button, XpadPreferences *pref);
122 static void change_new_pad_width (GtkSpinButton *button, XpadPreferences *pref);
123 static void change_autostart_xpad (GtkToggleButton *button, XpadPreferences *pref);
124 static void change_autostart_wait_systray (GtkToggleButton *button, XpadPreferences *pref);
125 static void change_autostart_delay (GtkComboBox *box, XpadPreferences *pref);
126 static void change_autostart_new_pad (GtkToggleButton *button, XpadPreferences *pref);
127 static void change_autostart_sticky (GtkToggleButton *button, XpadPreferences *pref);
128 static void change_autostart_display_pads (GtkComboBox *box, XpadPreferences *pref);
129 static void change_tray_enabled (GtkToggleButton *button, XpadPreferences *pref);
130 static void change_tray_click (GtkComboBox *box, XpadPreferences *pref);
131 static void change_edit_check (GtkToggleButton *button, XpadPreferences *pref);
132 static void change_confirm_check (GtkToggleButton *button, XpadPreferences *pref);
133 static void change_has_decorations (GtkToggleButton *button, XpadPreferences *pref);
134 static void change_hide_from_taskbar (GtkToggleButton *button, XpadPreferences *pref);
135 static void change_hide_from_task_switcher (GtkToggleButton *button, XpadPreferences *pref);
136 static void change_has_toolbar (GtkToggleButton *button, XpadPreferences *pref);
137 static void change_autohide_toolbar (GtkToggleButton *button, XpadPreferences *pref);
138 static void change_has_scrollbar (GtkToggleButton *button, XpadPreferences *pref);
139 
140 static void notify_fontname (XpadPreferences *pref);
141 static void notify_text_color (XpadPreferences *pref);
142 static void notify_back_color (XpadPreferences *pref);
143 static void notify_autostart_xpad (XpadPreferences *pref);
144 static void notify_autostart_wait_systray (XpadPreferences *pref);
145 static void notify_autostart_delay (XpadPreferences *pref);
146 static void notify_autostart_new_pad (XpadPreferences *pref);
147 static void notify_autostart_sticky (XpadPreferences *pref);
148 static void notify_autostart_display_pads (XpadPreferences *pref);
149 static void notify_tray_enabled (XpadPreferences *pref);
150 static void notify_tray_click (XpadPreferences *pref);
151 static void notify_edit (XpadPreferences *pref);
152 static void notify_confirm (XpadPreferences *pref);
153 static void notify_has_decorations (XpadPreferences *pref);
154 static void notify_hide_from_taskbar (XpadPreferences *pref);
155 static void notify_hide_from_task_switcher (XpadPreferences *pref);
156 static void notify_has_toolbar (XpadPreferences *pref);
157 static void notify_autohide_toolbar (XpadPreferences *pref);
158 static void notify_has_scrollbar (XpadPreferences *pref);
159 
160 static GtkWidget * create_label (const gchar *label_text);
161 
162 static GtkWidget *_xpad_preferences = NULL;
163 
164 enum
165 {
166 	PROP_0,
167 	PROP_SETTINGS,
168 	N_PROPERTIES
169 };
170 
171 static GParamSpec *obj_prop[N_PROPERTIES] = { NULL, };
172 
173 void
xpad_preferences_open(XpadSettings * settings)174 xpad_preferences_open (XpadSettings *settings)
175 {
176 	if (!_xpad_preferences)
177 	{
178 		_xpad_preferences = GTK_WIDGET (g_object_new (XPAD_TYPE_PREFERENCES, "settings", settings, NULL));
179 		g_signal_connect_swapped (_xpad_preferences, "destroy", G_CALLBACK (g_nullify_pointer), &_xpad_preferences);
180 	}
181 
182 	gtk_window_present (GTK_WINDOW (_xpad_preferences));
183 }
184 
185 static void
xpad_preferences_class_init(XpadPreferencesClass * klass)186 xpad_preferences_class_init (XpadPreferencesClass *klass)
187 {
188 	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
189 
190 	gobject_class->constructed = xpad_preferences_constructed;
191 	gobject_class->set_property = xpad_preferences_set_property;
192 	gobject_class->get_property = xpad_preferences_get_property;
193 	gobject_class->finalize = xpad_preferences_finalize;
194 
195 	obj_prop[PROP_SETTINGS] = g_param_spec_pointer ("settings", "Xpad settings", "Xpad global settings", G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
196 
197 	g_object_class_install_properties (gobject_class, N_PROPERTIES, obj_prop);
198 }
199 
200 static void
xpad_preferences_init(XpadPreferences * pref)201 xpad_preferences_init (XpadPreferences *pref)
202 {
203 	pref->priv = xpad_preferences_get_instance_private (pref);
204 }
205 
xpad_preferences_constructed(GObject * object)206 static void xpad_preferences_constructed (GObject *object)
207 {
208 	XpadPreferences *pref = XPAD_PREFERENCES (object);
209 
210 	GtkWidget *label, *label_height, *label_width;
211 	GtkBox *font_hbox, *vbox, *hbox, *view_vbox, *appearance_vbox, *start_vbox, *tray_vbox, *other_vbox, *pad_size_height_hbox, *pad_size_width_hbox, *pad_size_vbox;
212 	const GdkRGBA *text_color, *back_color;
213 	const gchar *fontname;
214 	GtkStyleContext *style;
215 	GtkSizeGroup *size_group_labels = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
216 	GdkRGBA theme_text_color = {0, 0, 0, 0}, theme_background_color = {0, 0, 0, 0};
217 	guint tray_click_configuration, autostart_delay, autostart_display_pads, height, width;
218 	gboolean confirm_destroy, edit_lock, autostart_xpad, autostart_wait_systray, autostart_new_pad, autostart_sticky, has_decorations, hide_from_taskbar, hide_from_task_switcher, has_toolbar, autohide_toolbar, has_scrollbar;
219 
220 	g_object_get (pref->priv->settings,
221 			"fontname", &fontname,
222 			"text-color", &text_color,
223 			"back-color", &back_color,
224 			"height", &height,
225 			"width", &width,
226 			"confirm-destroy", &confirm_destroy,
227 			"edit-lock", &edit_lock,
228 			"tray-click-configuration", &tray_click_configuration,
229 			"autostart-xpad", &autostart_xpad,
230 			"autostart-wait-systray", &autostart_wait_systray,
231 			"autostart-new-pad", &autostart_new_pad,
232 			"autostart-sticky", &autostart_sticky,
233 			"autostart-delay", &autostart_delay,
234 			"autostart-display-pads", &autostart_display_pads,
235 			"has-decorations", &has_decorations,
236 			"hide-from-taskbar", &hide_from_taskbar,
237 			"hide-from-task-switcher", &hide_from_task_switcher,
238 			"has-toolbar", &has_toolbar,
239 			"autohide-toolbar", &autohide_toolbar,
240 			"has-scrollbar", &has_scrollbar,
241 			NULL);
242 
243 	/* create notebook to add pages */
244 	pref->priv->notebook = gtk_notebook_new ();
245 
246 	/* View options */
247 	label = create_label (_("View"));
248 
249 	view_vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 20));
250 	gtk_box_set_homogeneous (view_vbox, FALSE);
251         gtk_widget_set_margin_top (GTK_WIDGET (view_vbox), 12);
252         gtk_widget_set_margin_bottom (GTK_WIDGET (view_vbox), 12);
253         gtk_widget_set_margin_start (GTK_WIDGET (view_vbox), 12);
254         gtk_widget_set_margin_end (GTK_WIDGET (view_vbox), 12);
255 
256 	gtk_notebook_append_page (GTK_NOTEBOOK (pref->priv->notebook), GTK_WIDGET (view_vbox), label);
257 
258 	pref->priv->has_toolbar = gtk_check_button_new_with_mnemonic (_("_Show toolbar"));
259 	gtk_box_pack_start (view_vbox, pref->priv->has_toolbar, FALSE, FALSE, 0);
260 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->has_toolbar), has_toolbar);
261 
262 	pref->priv->autohide_toolbar = gtk_check_button_new_with_mnemonic (_("_Autohide toolbar"));
263 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 20));
264 	gtk_box_pack_start (hbox, pref->priv->autohide_toolbar, FALSE, FALSE, 0);
265 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autohide_toolbar), autohide_toolbar);
266 	gtk_widget_set_sensitive (pref->priv->autohide_toolbar, has_toolbar);
267 	gtk_box_pack_start (view_vbox, GTK_WIDGET (hbox), FALSE, FALSE, 0);
268 
269 	pref->priv->has_scrollbar = gtk_check_button_new_with_mnemonic (_("_Show scrollbar"));
270 	gtk_box_pack_start (view_vbox, pref->priv->has_scrollbar, FALSE, FALSE, 0);
271 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->has_scrollbar), has_scrollbar);
272 
273 	pref->priv->autostart_sticky = gtk_check_button_new_with_mnemonic (_("_Show notes on all workspaces"));
274 	gtk_box_pack_start (view_vbox, pref->priv->autostart_sticky, FALSE, FALSE, 0);
275 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_sticky), autostart_sticky);
276 
277 	pref->priv->has_decorations = gtk_check_button_new_with_mnemonic (_("_Show window decorations"));
278 	gtk_box_pack_start (view_vbox, pref->priv->has_decorations, FALSE, FALSE, 0);
279 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->has_decorations), has_decorations);
280 
281 	pref->priv->hide_from_taskbar = gtk_check_button_new_with_mnemonic (_("_Hide all notes from the taskbar and possibly the task switcher"));
282 	gtk_box_pack_start (view_vbox, pref->priv->hide_from_taskbar, FALSE, FALSE, 0);
283 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->hide_from_taskbar), hide_from_taskbar);
284 
285 	pref->priv->hide_from_task_switcher = gtk_check_button_new_with_mnemonic (_("_Hide all notes from the workspace switcher and possibly the task switcher"));
286 	gtk_box_pack_start (view_vbox, pref->priv->hide_from_task_switcher, FALSE, FALSE, 0);
287 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->hide_from_task_switcher), hide_from_task_switcher);
288 
289 	/* Layout options */
290 	label = create_label (_("Layout"));
291 
292 	appearance_vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 20));
293 	gtk_box_set_homogeneous (appearance_vbox, FALSE);
294 	gtk_widget_set_margin_top (GTK_WIDGET (appearance_vbox), 12);
295 	gtk_widget_set_margin_bottom (GTK_WIDGET (appearance_vbox), 12);
296 	gtk_widget_set_margin_start (GTK_WIDGET (appearance_vbox), 12);
297 	gtk_widget_set_margin_end (GTK_WIDGET (appearance_vbox), 12);
298 
299 	gtk_notebook_append_page (GTK_NOTEBOOK (pref->priv->notebook), GTK_WIDGET (appearance_vbox), label);
300 
301 	pref->priv->textbutton = gtk_color_button_new ();
302 	pref->priv->fontbutton = gtk_font_button_new ();
303 	pref->priv->backbutton = gtk_color_button_new ();
304 	pref->priv->colorbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
305 
306 	pref->priv->antifontcheck = gtk_radio_button_new_with_mnemonic (NULL, _("Use font from theme"));
307 	pref->priv->fontcheck = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (pref->priv->antifontcheck), _("Use this font"));
308 	pref->priv->anticolorcheck = gtk_radio_button_new_with_mnemonic (NULL, _("Use colors from theme"));
309 	pref->priv->colorcheck = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (pref->priv->anticolorcheck), _("Use these colors"));
310 	gtk_widget_set_margin_start (GTK_WIDGET (pref->priv->colorbox), 25);
311 
312 	/* Size of new pads: input fields */
313 	label_height = gtk_label_new_with_mnemonic (_("Height new pad"));
314 	gtk_size_group_add_widget (size_group_labels, label_height);
315 	pref->priv->height = gtk_spin_button_new_with_range (10, 99999, 10);
316 	gtk_spin_button_set_value (GTK_SPIN_BUTTON(pref->priv->height), height);
317     gtk_widget_set_margin_start (pref->priv->height, 12);
318 
319 	label_width = gtk_label_new_with_mnemonic (_("Width new pad"));
320 	gtk_size_group_add_widget (size_group_labels, label_width);
321 	pref->priv->width = gtk_spin_button_new_with_range (10, 99999, 10);
322 	gtk_spin_button_set_value (GTK_SPIN_BUTTON(pref->priv->width), width);
323     gtk_widget_set_margin_start (pref->priv->width, 12);
324 
325 	/* Start adding the input pieces together in boxes */
326 	pad_size_height_hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6));
327 	gtk_box_pack_start (pad_size_height_hbox, label_height, FALSE, FALSE, 0);
328 	gtk_box_pack_start (pad_size_height_hbox, pref->priv->height, FALSE, FALSE, 0);
329 	pad_size_width_hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6));
330 	gtk_box_pack_start (pad_size_width_hbox, label_width, FALSE, FALSE, 0);
331 	gtk_box_pack_start (pad_size_width_hbox, pref->priv->width, FALSE, FALSE, 0);
332 
333 	pad_size_vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
334 	gtk_box_pack_start (pad_size_vbox, GTK_WIDGET (pad_size_height_hbox), FALSE, TRUE, 0);
335 	gtk_box_pack_start (pad_size_vbox, GTK_WIDGET (pad_size_width_hbox), FALSE, TRUE, 0);
336 
337 	font_hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6));
338 	gtk_box_pack_start (font_hbox, pref->priv->fontcheck, FALSE, TRUE, 0);
339 	gtk_box_pack_start (font_hbox, pref->priv->fontbutton, FALSE, TRUE, 0);
340 
341 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12));
342 	label = gtk_label_new_with_mnemonic (_("Text"));
343 	gtk_size_group_add_widget (size_group_labels, label);
344 	gtk_box_pack_start (hbox, label, FALSE, FALSE, 0);
345 	gtk_box_pack_start (hbox, pref->priv->textbutton, FALSE, TRUE, 0);
346 	g_object_set (G_OBJECT (pref->priv->colorbox), "child", hbox, NULL);
347 
348 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12));
349 
350 	label = gtk_label_new_with_mnemonic (_("Background"));
351 	gtk_size_group_add_widget (size_group_labels, label);
352 	gtk_box_pack_start (hbox, label, FALSE, FALSE, 0);
353 	gtk_box_pack_start (hbox, pref->priv->backbutton, FALSE, TRUE, 0);
354 	g_object_set (G_OBJECT (pref->priv->colorbox), "child", hbox, NULL);
355 
356 	style = gtk_widget_get_style_context (GTK_WIDGET(pref));
357 	gtk_style_context_get_color (style, GTK_STATE_FLAG_NORMAL, &theme_text_color);
358 	get_background_color (style, GTK_STATE_FLAG_NORMAL, &theme_background_color);
359 
360 	if (fontname)
361 	{
362 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->fontcheck), TRUE);
363 		gtk_font_chooser_set_font (GTK_FONT_CHOOSER (pref->priv->fontbutton), fontname);
364 	}
365 	else
366 	{
367 		PangoFontDescription *font;
368 
369 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->antifontcheck), TRUE);
370 		gtk_widget_set_sensitive (pref->priv->fontbutton, FALSE);
371 
372 		gtk_style_context_get (style, GTK_STATE_FLAG_NORMAL, GTK_STYLE_PROPERTY_FONT, &font, NULL);
373 		gtk_font_chooser_set_font (GTK_FONT_CHOOSER (pref->priv->fontbutton), pango_font_description_to_string(font));
374 		pango_font_description_free (font);
375 	}
376 
377 	if (text_color)
378 		gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pref->priv->textbutton), text_color);
379 	else
380 		gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pref->priv->textbutton), &theme_text_color);
381 
382 	if (back_color)
383 	{
384 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->colorcheck), TRUE);
385 		gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pref->priv->backbutton), back_color);
386 	}
387 	else
388 	{
389 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->anticolorcheck), TRUE);
390 		gtk_widget_set_sensitive (pref->priv->colorbox, FALSE);
391 		gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pref->priv->backbutton), &theme_background_color);
392 	}
393 
394 	vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
395 	gtk_box_pack_start (vbox, pref->priv->antifontcheck, FALSE, FALSE, 0);
396 	gtk_box_pack_start (vbox, GTK_WIDGET (font_hbox), FALSE, FALSE, 0);
397 	gtk_box_pack_start (appearance_vbox, GTK_WIDGET (vbox), FALSE, FALSE, 0);
398 
399 	vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
400 	gtk_box_pack_start (vbox, pref->priv->anticolorcheck, FALSE, FALSE, 0);
401 	gtk_box_pack_start (vbox, pref->priv->colorcheck, FALSE, FALSE, 0);
402 	gtk_box_pack_start (vbox, pref->priv->colorbox, FALSE, FALSE, 0);
403 	gtk_box_pack_start (appearance_vbox, GTK_WIDGET (vbox), FALSE, FALSE, 0);
404 
405 	vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
406 	gtk_box_pack_start (vbox, GTK_WIDGET (pad_size_vbox), FALSE, FALSE, 0);
407 	gtk_box_pack_start (appearance_vbox, GTK_WIDGET (vbox), FALSE, FALSE, 0);
408 
409 	gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (pref->priv->textbutton), FALSE);
410 	gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (pref->priv->backbutton), TRUE);
411 
412 	gtk_color_button_set_title (GTK_COLOR_BUTTON (pref->priv->textbutton), _("Set Foreground Color"));
413 	gtk_color_button_set_title (GTK_COLOR_BUTTON (pref->priv->backbutton), _("Set Background Color"));
414 	gtk_font_button_set_title (GTK_FONT_BUTTON (pref->priv->fontbutton), _("Set Font"));
415 
416 	/* Start options */
417 	label = create_label (_("Startup"));
418 
419 	start_vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
420 	gtk_box_set_homogeneous (start_vbox, FALSE);
421         gtk_widget_set_margin_top (GTK_WIDGET (start_vbox), 12);
422         gtk_widget_set_margin_bottom (GTK_WIDGET (start_vbox), 12);
423         gtk_widget_set_margin_start (GTK_WIDGET (start_vbox), 12);
424         gtk_widget_set_margin_end (GTK_WIDGET (start_vbox), 12);
425 
426 	gtk_notebook_append_page (GTK_NOTEBOOK (pref->priv->notebook), GTK_WIDGET (start_vbox), label);
427 
428 	pref->priv->autostart_xpad = gtk_check_button_new_with_mnemonic (_("_Start Xpad automatically after login"));
429 	gtk_box_pack_start (start_vbox, pref->priv->autostart_xpad, FALSE, FALSE, 0);
430 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_xpad), autostart_xpad);
431 
432 	pref->priv->autostart_wait_systray = gtk_check_button_new_with_mnemonic (_("_Wait for systray (if possible)"));
433 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 20));
434 	gtk_box_pack_start (hbox, pref->priv->autostart_wait_systray, FALSE, FALSE, 0);
435 
436 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_wait_systray), autostart_wait_systray);
437 	if (autostart_xpad)
438 		gtk_widget_set_sensitive (pref->priv->autostart_wait_systray, TRUE);
439 	else
440 		gtk_widget_set_sensitive (pref->priv->autostart_wait_systray, FALSE);
441 	gtk_box_pack_start (start_vbox, GTK_WIDGET (hbox), FALSE, FALSE, 0);
442 
443 	pref->priv->autostart_new_pad = gtk_check_button_new_with_mnemonic (_("_Open a new empty pad"));
444 	gtk_box_pack_start (start_vbox, pref->priv->autostart_new_pad, FALSE, FALSE, 0);
445 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_new_pad), autostart_new_pad);
446 
447 	label = gtk_label_new (_("Delay in seconds"));
448 	pref->priv->autostart_delay = gtk_combo_box_text_new();
449 	guint i;
450 	for (i=0; i<15; i++)
451 		gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->autostart_delay), g_strdup_printf ("%i", i));
452 	gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->autostart_delay), autostart_delay);
453 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12));
454 	gtk_box_pack_start (hbox, label, FALSE, FALSE, 0);
455 	gtk_box_pack_start (hbox, pref->priv->autostart_delay, FALSE, TRUE, 0);
456 	gtk_box_pack_start (start_vbox, GTK_WIDGET (hbox), FALSE, FALSE, 0);
457 
458 	label = gtk_label_new_with_mnemonic(_("Display pads"));
459 	pref->priv->autostart_display_pads = gtk_combo_box_text_new();
460 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->autostart_display_pads), _("Open all pads"));
461 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->autostart_display_pads), _("Hide all pads"));
462 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->autostart_display_pads), _("Restore to previous state") );
463 	gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->autostart_display_pads), (guint) autostart_display_pads);
464 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12));
465 	gtk_box_pack_start (hbox, label, FALSE, FALSE, 0);
466 	gtk_box_pack_start (hbox, pref->priv->autostart_display_pads, FALSE, TRUE, 0);
467 	gtk_box_pack_start (start_vbox, GTK_WIDGET (hbox), FALSE, FALSE, 0);
468 
469 	/* Tray options */
470 	label = create_label (_("Tray"));
471 
472 	tray_vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
473 	gtk_box_set_homogeneous (tray_vbox, FALSE);
474         gtk_widget_set_margin_top (GTK_WIDGET (tray_vbox), 12);
475         gtk_widget_set_margin_bottom (GTK_WIDGET (tray_vbox), 12);
476         gtk_widget_set_margin_start (GTK_WIDGET (tray_vbox), 12);
477         gtk_widget_set_margin_end (GTK_WIDGET (tray_vbox), 12);
478 
479 	gtk_notebook_append_page (GTK_NOTEBOOK (pref->priv->notebook), GTK_WIDGET (tray_vbox), label);
480 
481 	pref->priv->tray_enabled = gtk_check_button_new_with_mnemonic (_("_Enable tray icon"));
482 	gtk_box_pack_start (tray_vbox, pref->priv->tray_enabled, FALSE, FALSE, 0);
483 
484 	label = gtk_label_new_with_mnemonic(_("Tray left mouse click behaviour"));
485 	pref->priv->tray_click_configuration = gtk_combo_box_text_new();
486 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("Do Nothing") );
487 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("Toggle Show All") );
488 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("List of Pads") );
489 	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (pref->priv->tray_click_configuration), _("New Pad") );
490 	gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->tray_click_configuration), tray_click_configuration);
491 	hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6));
492 	gtk_box_pack_start (hbox, label, FALSE, FALSE, 0);
493 	gtk_box_pack_start (hbox, pref->priv->tray_click_configuration, FALSE, TRUE, 0);
494 	gtk_box_pack_start (tray_vbox, GTK_WIDGET (hbox), FALSE, FALSE, 0);
495 
496 	/* Other options */
497 	label = create_label (_("Other"));
498 
499 	other_vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
500 	gtk_box_set_homogeneous (other_vbox, FALSE);
501         gtk_widget_set_margin_top (GTK_WIDGET (other_vbox), 12);
502         gtk_widget_set_margin_bottom (GTK_WIDGET (other_vbox), 12);
503         gtk_widget_set_margin_start (GTK_WIDGET (other_vbox), 12);
504         gtk_widget_set_margin_end (GTK_WIDGET (other_vbox), 12);
505 
506 	gtk_notebook_append_page (GTK_NOTEBOOK (pref->priv->notebook), GTK_WIDGET (other_vbox), label);
507 
508 	pref->priv->editcheck = gtk_check_button_new_with_mnemonic (_("_Make pads read-only"));
509 	pref->priv->confirmcheck = gtk_check_button_new_with_mnemonic (_("_Confirm pad deletion"));
510 
511 	gtk_box_pack_start (other_vbox, pref->priv->editcheck, FALSE, FALSE, 0);
512 	gtk_box_pack_start (other_vbox, pref->priv->confirmcheck, FALSE, FALSE, 0);
513 
514 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->editcheck), edit_lock);
515 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->confirmcheck), confirm_destroy);
516 
517 	/* Close button and window title */
518 	GtkWidget *button = gtk_button_new_from_icon_name ("gtk-close", GTK_ICON_SIZE_BUTTON);
519 	gtk_button_set_label (GTK_BUTTON (button), _("Close"));
520 	g_signal_connect_swapped (GTK_BUTTON (button), "clicked", G_CALLBACK (gtk_widget_destroy), GTK_WIDGET (pref));
521 	gtk_window_set_title (GTK_WINDOW (pref), _("Xpad Preferences"));
522 
523 	/* Add preference tabs and the close button together */
524 	vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0));
525  	gtk_container_add (GTK_CONTAINER (vbox), pref->priv->notebook);
526  	gtk_container_add (GTK_CONTAINER (vbox), button);
527  	gtk_container_add (GTK_CONTAINER (pref), GTK_WIDGET (vbox));
528 
529 	/* Add CSS style class, so the styling can be overridden by a GTK theme */
530 	GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET (pref));
531 	gtk_style_context_add_class(context, "XpadPreferences");
532 
533  	/* Activate all handlers */
534 	pref->priv->has_decorations_handler = g_signal_connect (pref->priv->has_decorations, "toggled", G_CALLBACK (change_has_decorations), pref);
535 	pref->priv->hide_from_taskbar_handler = g_signal_connect (pref->priv->hide_from_taskbar, "toggled", G_CALLBACK (change_hide_from_taskbar), pref);
536 	pref->priv->hide_from_task_switcher_handler = g_signal_connect (pref->priv->hide_from_task_switcher, "toggled", G_CALLBACK (change_hide_from_task_switcher), pref);
537 	pref->priv->has_toolbar_handler = g_signal_connect (pref->priv->has_toolbar, "toggled", G_CALLBACK (change_has_toolbar), pref);
538 	pref->priv->autohide_toolbar_handler = g_signal_connect (pref->priv->autohide_toolbar, "toggled", G_CALLBACK (change_autohide_toolbar), pref);
539 	pref->priv->has_scrollbar_handler = g_signal_connect (pref->priv->has_scrollbar, "toggled", G_CALLBACK (change_has_scrollbar), pref);
540 
541 	pref->priv->fontcheck_handler = g_signal_connect (pref->priv->fontcheck, "toggled", G_CALLBACK (change_font_check), pref);
542 	pref->priv->font_handler = g_signal_connect (pref->priv->fontbutton, "font-set", G_CALLBACK (change_font_face), pref);
543 	pref->priv->colorcheck_handler = g_signal_connect (pref->priv->colorcheck, "toggled", G_CALLBACK (change_color_check), pref);
544 	pref->priv->text_handler = g_signal_connect (pref->priv->textbutton, "color-set", G_CALLBACK (change_text_color), pref);
545 	pref->priv->back_handler = g_signal_connect (pref->priv->backbutton, "color-set", G_CALLBACK (change_back_color), pref);
546 
547 	pref->priv->new_pad_height_handler = g_signal_connect (pref->priv->height, "value-changed", G_CALLBACK (change_new_pad_height), pref);
548 	pref->priv->new_pad_width_handler = g_signal_connect (pref->priv->width, "value-changed", G_CALLBACK (change_new_pad_width), pref);
549 
550 	pref->priv->autostart_xpad_handler = g_signal_connect (pref->priv->autostart_xpad, "toggled", G_CALLBACK (change_autostart_xpad), pref);
551 	pref->priv->autostart_wait_systray_handler = g_signal_connect (pref->priv->autostart_wait_systray, "toggled", G_CALLBACK (change_autostart_wait_systray), pref);
552 	pref->priv->autostart_delay_handler = g_signal_connect(pref->priv->autostart_delay, "changed", G_CALLBACK(change_autostart_delay), pref);
553 	pref->priv->autostart_new_pad_handler = g_signal_connect (pref->priv->autostart_new_pad, "toggled", G_CALLBACK (change_autostart_new_pad), pref);
554 	pref->priv->autostart_sticky_handler = g_signal_connect (pref->priv->autostart_sticky, "toggled", G_CALLBACK (change_autostart_sticky), pref);
555 	pref->priv->autostart_display_pads_handler = g_signal_connect (pref->priv->autostart_display_pads, "changed", G_CALLBACK (change_autostart_display_pads), pref);
556 
557 	pref->priv->tray_enabled_handler = g_signal_connect (pref->priv->tray_enabled, "toggled", G_CALLBACK (change_tray_enabled), pref);
558 	pref->priv->tray_click_handler = g_signal_connect(pref->priv->tray_click_configuration, "changed", G_CALLBACK(change_tray_click), pref);
559 	pref->priv->editcheck_handler = g_signal_connect (pref->priv->editcheck, "toggled", G_CALLBACK (change_edit_check), pref);
560 	pref->priv->confirmcheck_handler = g_signal_connect (pref->priv->confirmcheck, "toggled", G_CALLBACK (change_confirm_check), pref);
561 
562 	pref->priv->notify_has_decorations_handler = g_signal_connect_swapped (pref->priv->settings, "notify::has-decorations", G_CALLBACK (notify_has_decorations), pref);
563 	pref->priv->notify_hide_from_taskbar_handler = g_signal_connect_swapped (pref->priv->settings, "notify::hide-from-taskbar", G_CALLBACK (notify_hide_from_taskbar), pref);
564 	pref->priv->notify_hide_from_task_switcher_handler = g_signal_connect_swapped (pref->priv->settings, "notify::hide-from-task-switcher", G_CALLBACK (notify_hide_from_task_switcher), pref);
565 	pref->priv->notify_has_toolbar_handler = g_signal_connect_swapped (pref->priv->settings, "notify::has-toolbar", G_CALLBACK (notify_has_toolbar), pref);
566 	pref->priv->notify_autohide_toolbar_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autohide-toolbar", G_CALLBACK (notify_autohide_toolbar), pref);
567 	pref->priv->notify_has_scrollbar_handler = g_signal_connect_swapped (pref->priv->settings, "notify::has-scrollbar", G_CALLBACK (notify_has_scrollbar), pref);
568 
569 	pref->priv->notify_font_handler = g_signal_connect_swapped (pref->priv->settings, "notify::fontname", G_CALLBACK (notify_fontname), pref);
570 	pref->priv->notify_text_handler = g_signal_connect_swapped (pref->priv->settings, "notify::text-color", G_CALLBACK (notify_text_color), pref);
571 	pref->priv->notify_back_handler = g_signal_connect_swapped (pref->priv->settings, "notify::back-color", G_CALLBACK (notify_back_color), pref);
572 
573 	pref->priv->notify_autostart_xpad_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-xpad", G_CALLBACK (notify_autostart_xpad), pref);
574 	pref->priv->notify_autostart_wait_systray_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-wait-systray", G_CALLBACK (notify_autostart_wait_systray), pref);
575 	pref->priv->notify_autostart_delay_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-delay", G_CALLBACK(notify_autostart_delay), pref);
576 	pref->priv->notify_autostart_new_pad_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-new-pad", G_CALLBACK (notify_autostart_new_pad), pref);
577 	pref->priv->notify_autostart_sticky_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-sticky", G_CALLBACK (notify_autostart_sticky), pref);
578 	pref->priv->notify_autostart_display_pads_handler = g_signal_connect_swapped (pref->priv->settings, "notify::autostart-display-pads", G_CALLBACK (notify_autostart_display_pads), pref);
579 	pref->priv->notify_edit_handler = g_signal_connect_swapped (pref->priv->settings, "notify::edit-lock", G_CALLBACK (notify_edit), pref);
580 	pref->priv->notify_confirm_handler = g_signal_connect_swapped (pref->priv->settings, "notify::confirm-destroy", G_CALLBACK (notify_confirm), pref);
581 	pref->priv->notify_tray_enabled_handler = g_signal_connect_swapped (pref->priv->settings, "notify::tray-enabled", G_CALLBACK (notify_tray_enabled), pref);
582 	pref->priv->notify_tray_click_handler = g_signal_connect_swapped (pref->priv->settings, "notify::tray-click-configuration", G_CALLBACK(notify_tray_click), pref);
583 
584 	g_clear_object (&size_group_labels);
585 
586 	/* Initialize the GUI logic */
587 	g_object_notify (G_OBJECT (pref->priv->settings), "tray-enabled");
588 
589 	/* Make the preference window visible */
590 	gtk_window_set_position (GTK_WINDOW (pref), GTK_WIN_POS_CENTER);
591 	gtk_widget_show_all (GTK_WIDGET (pref));
592 	gtk_window_set_resizable (GTK_WINDOW (pref), FALSE);
593 }
594 
create_label(const gchar * label_text)595 static GtkWidget * create_label (const gchar *label_text) {
596 	GtkWidget *label = GTK_WIDGET (g_object_new (GTK_TYPE_LABEL,
597 		"label", g_strconcat ("<b>", label_text, "</b>", NULL),
598 		"use-markup", TRUE,
599 		"xalign", 0.0,
600 		NULL));
601 	return label;
602 }
603 
604 static void
xpad_preferences_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)605 xpad_preferences_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
606 {
607 	XpadPreferences *pref = XPAD_PREFERENCES (object);
608 
609 	switch (prop_id)
610 	{
611 	case PROP_SETTINGS:
612 		pref->priv->settings = g_value_get_pointer (value);
613 		g_object_ref (pref->priv->settings);
614 		break;
615 
616 	default:
617 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
618 		break;
619 	}
620 }
621 
622 static void
xpad_preferences_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)623 xpad_preferences_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
624 {
625 	XpadPreferences *pref = XPAD_PREFERENCES (object);
626 
627 	switch (prop_id)
628 	{
629 	case PROP_SETTINGS:
630 		g_value_set_pointer (value, pref->priv->settings);
631 		break;
632 
633 	default:
634 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
635 		break;
636 	}
637 }
638 
639 static void
xpad_preferences_finalize(GObject * object)640 xpad_preferences_finalize (GObject *object)
641 {
642 	XpadPreferences *pref = XPAD_PREFERENCES (object);
643 
644 	if (pref->priv->settings)
645 		g_signal_handlers_disconnect_matched (pref->priv->settings, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, pref);
646 
647 	G_OBJECT_CLASS (xpad_preferences_parent_class)->finalize (object);
648 }
649 
650 static void
change_font_check(GtkToggleButton * button,XpadPreferences * pref)651 change_font_check (GtkToggleButton *button, XpadPreferences *pref)
652 {
653 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_font_handler);
654 
655 	if (gtk_toggle_button_get_active (button)) {
656 		g_object_set (pref->priv->settings, "fontname", gtk_font_chooser_get_font (GTK_FONT_CHOOSER (pref->priv->fontbutton)), NULL);
657 	} else {
658 		g_object_set (pref->priv->settings, "fontname", NULL, NULL);
659 	}
660 
661 	gtk_widget_set_sensitive (pref->priv->fontbutton, gtk_toggle_button_get_active (button));
662 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_font_handler);
663 }
664 
665 static void
change_font_face(GtkFontChooser * button,XpadPreferences * pref)666 change_font_face (GtkFontChooser *button, XpadPreferences *pref)
667 {
668 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_font_handler);
669 	g_object_set (pref->priv->settings, "fontname", gtk_font_chooser_get_font (button), NULL);
670 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_font_handler);
671 }
672 
673 static void
change_color_check(GtkToggleButton * button,XpadPreferences * pref)674 change_color_check (GtkToggleButton *button, XpadPreferences *pref)
675 {
676 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_text_handler);
677 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_back_handler);
678 
679 	if (gtk_toggle_button_get_active (button)) {
680 		GdkRGBA text_color, back_color;
681 		gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (pref->priv->textbutton), &text_color);
682 		gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (pref->priv->backbutton), &back_color);
683 		g_object_set (pref->priv->settings, "text-color", &text_color, "back-color", &back_color, NULL);
684 	} else {
685 		g_object_set (pref->priv->settings, "text-color", NULL, "back-color", NULL, NULL);
686 	}
687 
688 	gtk_widget_set_sensitive (pref->priv->colorbox, gtk_toggle_button_get_active (button));
689 
690 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_text_handler);
691 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_back_handler);
692 }
693 
694 static void
change_text_color(GtkColorChooser * chooser,XpadPreferences * pref)695 change_text_color (GtkColorChooser *chooser, XpadPreferences *pref)
696 {
697 	GdkRGBA text_color = {0, 0, 0, 0};
698 	gtk_color_chooser_get_rgba (chooser, &text_color);
699 
700 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_text_handler);
701 	g_object_set (pref->priv->settings, "text-color", &text_color, NULL);
702 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_text_handler);
703 }
704 
705 static void
change_back_color(GtkColorChooser * chooser,XpadPreferences * pref)706 change_back_color (GtkColorChooser *chooser, XpadPreferences *pref)
707 {
708 	GdkRGBA back_color = {0, 0, 0, 0};
709 	gtk_color_chooser_get_rgba (chooser, &back_color);
710 
711 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_back_handler);
712 	g_object_set (pref->priv->settings, "back-color", &back_color, NULL);
713 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_back_handler);
714 }
715 
716 static void
change_autostart_xpad(GtkToggleButton * button,XpadPreferences * pref)717 change_autostart_xpad (GtkToggleButton *button, XpadPreferences *pref)
718 {
719 	g_object_set (pref->priv->settings, "autostart-xpad", gtk_toggle_button_get_active (button), NULL);
720 }
721 
722 static void
change_autostart_wait_systray(GtkToggleButton * button,XpadPreferences * pref)723 change_autostart_wait_systray (GtkToggleButton *button, XpadPreferences *pref)
724 {
725 	GKeyFile *keyfile;
726 	GKeyFileFlags flags;
727 	GError *error = NULL;
728 	char *filename;
729 	gboolean wait_systray;
730 
731 	wait_systray = gtk_toggle_button_get_active (button);
732 
733 	/* Create a new GKeyFile object and a bitwise list of flags. */
734 	keyfile = g_key_file_new ();
735 	filename = g_strdup_printf ("%s/.config/autostart/xpad.desktop", g_get_home_dir());
736 	flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
737 
738 	/* Load the GKeyFile from xpad.desktop or show an error message. */
739 	if (!g_key_file_load_from_file (keyfile, filename, flags, &error)) {
740 		gchar *errtext;
741 		errtext = g_strdup_printf (_("Could not load %s\n%s"), filename, error->message);
742 		xpad_app_error (NULL, _("Error changing wait for systray setting"), errtext);
743 		g_free (errtext);
744 
745 		gtk_toggle_button_set_active (button, !wait_systray);
746 		return;
747 	}
748 
749 	g_key_file_set_boolean (keyfile, "Desktop Entry", "X-LXQt-Need-Tray", wait_systray);
750 
751 	if (!g_key_file_save_to_file (keyfile, filename, &error)) {
752 		gchar *errtext;
753 		errtext = g_strdup_printf (_("Could not save %s\n%s"), filename, error->message);
754 		xpad_app_error (NULL, _("Error changing wait for systray setting"), errtext);
755 		g_free (errtext);
756 
757 		gtk_toggle_button_set_active (button, !wait_systray);
758 		return;
759 	}
760 
761 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_autostart_wait_systray_handler);
762 	g_object_set (pref->priv->settings, "autostart-wait-systray", wait_systray, NULL);
763 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_autostart_wait_systray_handler);
764 }
765 
766 static void
change_autostart_new_pad(GtkToggleButton * button,XpadPreferences * pref)767 change_autostart_new_pad (GtkToggleButton *button, XpadPreferences *pref)
768 {
769 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_autostart_new_pad_handler);
770 	g_object_set (pref->priv->settings, "autostart-new-pad", gtk_toggle_button_get_active (button), NULL);
771 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_autostart_new_pad_handler);
772 }
773 
774 static void
change_autostart_sticky(GtkToggleButton * button,XpadPreferences * pref)775 change_autostart_sticky (GtkToggleButton *button, XpadPreferences *pref)
776 {
777 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_autostart_sticky_handler);
778 	gboolean is_sticky = gtk_toggle_button_get_active (button);
779 	g_object_set (pref->priv->settings, "autostart-sticky", is_sticky, NULL);
780 	xpad_pad_group_update_sticky (xpad_app_get_pad_group(), is_sticky);
781 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_autostart_sticky_handler);
782 }
783 
784 static void
change_autostart_delay(GtkComboBox * box,XpadPreferences * pref)785 change_autostart_delay (GtkComboBox *box, XpadPreferences *pref)
786 {
787 	g_signal_handler_block(pref->priv->settings, pref->priv->notify_autostart_delay_handler);
788 	g_object_set (pref->priv->settings, "autostart-delay", (guint) gtk_combo_box_get_active (box), NULL);
789 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_autostart_delay_handler);
790 }
791 
792 static void
change_autostart_display_pads(GtkComboBox * box,XpadPreferences * pref)793 change_autostart_display_pads (GtkComboBox *box, XpadPreferences *pref)
794 {
795 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_autostart_display_pads_handler);
796 	g_object_set (pref->priv->settings, "autostart-display-pads", (guint) gtk_combo_box_get_active (box), NULL);
797 	g_signal_handler_unblock(pref->priv->settings, pref->priv->notify_autostart_display_pads_handler);
798 }
799 
800 static void
change_tray_enabled(GtkToggleButton * button,XpadPreferences * pref)801 change_tray_enabled (GtkToggleButton *button, XpadPreferences *pref)
802 {
803 	g_object_set (pref->priv->settings, "tray-enabled", gtk_toggle_button_get_active (button), NULL);
804 }
805 
806 static void
change_tray_click(GtkComboBox * box,XpadPreferences * pref)807 change_tray_click (GtkComboBox *box, XpadPreferences *pref)
808 {
809 	g_signal_handler_block(pref->priv->settings, pref->priv->notify_tray_click_handler);
810 	g_object_set (pref->priv->settings, "tray-click-configuration", (guint) gtk_combo_box_get_active (box), NULL);
811 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_tray_click_handler);
812 }
813 
814 static void
change_edit_check(GtkToggleButton * button,XpadPreferences * pref)815 change_edit_check (GtkToggleButton *button, XpadPreferences *pref)
816 {
817 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_edit_handler);
818 	g_object_set (pref->priv->settings, "edit-lock", gtk_toggle_button_get_active (button), NULL);
819 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_edit_handler);
820 }
821 
822 static void
change_confirm_check(GtkToggleButton * button,XpadPreferences * pref)823 change_confirm_check (GtkToggleButton *button, XpadPreferences *pref)
824 {
825 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_confirm_handler);
826 	g_object_set (pref->priv->settings, "confirm-destroy", gtk_toggle_button_get_active (button), NULL);
827 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_confirm_handler);
828 }
829 
830 static void
change_has_decorations(GtkToggleButton * button,XpadPreferences * pref)831 change_has_decorations (GtkToggleButton *button, XpadPreferences *pref)
832 {
833 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_has_decorations_handler);
834 	g_object_set (pref->priv->settings, "has-decorations", gtk_toggle_button_get_active (button), NULL);
835 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_has_decorations_handler);
836 }
837 
838 static void
change_hide_from_taskbar(GtkToggleButton * button,XpadPreferences * pref)839 change_hide_from_taskbar (GtkToggleButton *button, XpadPreferences *pref)
840 {
841 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_hide_from_taskbar_handler);
842 	g_object_set (pref->priv->settings, "hide-from-taskbar", gtk_toggle_button_get_active (button), NULL);
843 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_hide_from_taskbar_handler);
844 }
845 
846 static void
change_hide_from_task_switcher(GtkToggleButton * button,XpadPreferences * pref)847 change_hide_from_task_switcher (GtkToggleButton *button, XpadPreferences *pref)
848 {
849 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_hide_from_task_switcher_handler);
850 	g_object_set (pref->priv->settings, "hide-from-task-switcher", gtk_toggle_button_get_active (button), NULL);
851 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_hide_from_task_switcher_handler);
852 }
853 
854 static void
change_has_toolbar(GtkToggleButton * button,XpadPreferences * pref)855 change_has_toolbar (GtkToggleButton *button, XpadPreferences *pref)
856 {
857 	g_object_set (pref->priv->settings, "has-toolbar", gtk_toggle_button_get_active (button), NULL);
858 }
859 
860 static void
change_autohide_toolbar(GtkToggleButton * button,XpadPreferences * pref)861 change_autohide_toolbar (GtkToggleButton *button, XpadPreferences *pref)
862 {
863 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_autohide_toolbar_handler);
864 	g_object_set (pref->priv->settings, "autohide-toolbar", gtk_toggle_button_get_active (button), NULL);
865 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_autohide_toolbar_handler);
866 }
867 
868 static void
change_has_scrollbar(GtkToggleButton * button,XpadPreferences * pref)869 change_has_scrollbar (GtkToggleButton *button, XpadPreferences *pref)
870 {
871 	g_signal_handler_block (pref->priv->settings, pref->priv->notify_has_scrollbar_handler);
872 	g_object_set (pref->priv->settings, "has-scrollbar", gtk_toggle_button_get_active (button), NULL);
873 	g_signal_handler_unblock (pref->priv->settings, pref->priv->notify_has_scrollbar_handler);
874 }
875 
876 static void
change_new_pad_height(GtkSpinButton * button,XpadPreferences * pref)877 change_new_pad_height (GtkSpinButton *button, XpadPreferences *pref)
878 {
879 	g_object_set (pref->priv->settings, "height", gtk_spin_button_get_value_as_int(button), NULL);
880 }
881 
882 static void
change_new_pad_width(GtkSpinButton * button,XpadPreferences * pref)883 change_new_pad_width (GtkSpinButton *button, XpadPreferences *pref)
884 {
885 	g_object_set (pref->priv->settings, "width", gtk_spin_button_get_value_as_int(button), NULL);
886 }
887 
888 static void
notify_fontname(XpadPreferences * pref)889 notify_fontname (XpadPreferences *pref)
890 {
891 	const gchar *fontname;
892 	g_object_get (pref->priv->settings, "fontname", &fontname, NULL);
893 
894 	g_signal_handler_block (pref->priv->fontbutton, pref->priv->font_handler);
895 	g_signal_handler_block (pref->priv->fontcheck, pref->priv->fontcheck_handler);
896 
897 	if (fontname)
898 	{
899 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->fontcheck), TRUE);
900 		gtk_widget_set_sensitive (pref->priv->fontbutton, TRUE);
901 		gtk_font_chooser_set_font (GTK_FONT_CHOOSER (pref->priv->fontbutton), fontname);
902 	}
903 	else
904 	{
905 		gtk_widget_set_sensitive (pref->priv->fontbutton, FALSE);
906 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->antifontcheck), TRUE);
907 	}
908 
909 	g_signal_handler_unblock (pref->priv->fontcheck, pref->priv->fontcheck_handler);
910 	g_signal_handler_unblock (pref->priv->fontbutton, pref->priv->font_handler);
911 }
912 
913 static void
notify_text_color(XpadPreferences * pref)914 notify_text_color (XpadPreferences *pref)
915 {
916 	const GdkRGBA *text_color;
917 	g_object_get (pref->priv->settings, "text-color", &text_color, NULL);
918 
919 	g_signal_handler_block (pref->priv->textbutton, pref->priv->text_handler);
920 	g_signal_handler_block (pref->priv->colorcheck, pref->priv->colorcheck_handler);
921 
922 	if (text_color)
923 	{
924 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->colorcheck), TRUE);
925 		gtk_widget_set_sensitive (pref->priv->colorbox, TRUE);
926 		gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pref->priv->textbutton), text_color);
927 
928 	}
929 	else
930 	{
931 		gtk_widget_set_sensitive (pref->priv->colorbox, FALSE);
932 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->anticolorcheck), TRUE);
933 	}
934 
935 	g_signal_handler_unblock (pref->priv->colorcheck, pref->priv->colorcheck_handler);
936 	g_signal_handler_unblock (pref->priv->textbutton, pref->priv->text_handler);
937 }
938 
939 static void
notify_back_color(XpadPreferences * pref)940 notify_back_color (XpadPreferences *pref)
941 {
942 	const GdkRGBA *back_color;
943 	g_object_get (pref->priv->settings, "back-color", &back_color, NULL);
944 
945 	g_signal_handler_block (pref->priv->backbutton, pref->priv->back_handler);
946 	g_signal_handler_block (pref->priv->colorcheck, pref->priv->colorcheck_handler);
947 
948 	if (back_color)
949 	{
950 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->colorcheck), TRUE);
951 		gtk_widget_set_sensitive (pref->priv->colorbox, TRUE);
952 		gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (pref->priv->backbutton), back_color);
953 	}
954 	else
955 	{
956 		gtk_widget_set_sensitive (pref->priv->colorbox, FALSE);
957 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->anticolorcheck), TRUE);
958 	}
959 
960 	g_signal_handler_unblock (pref->priv->colorcheck, pref->priv->colorcheck_handler);
961 	g_signal_handler_unblock (pref->priv->backbutton, pref->priv->back_handler);
962 }
963 
964 static void
notify_autostart_xpad(XpadPreferences * pref)965 notify_autostart_xpad (XpadPreferences *pref)
966 {
967 	gboolean value;
968 	g_object_get (pref->priv->settings, "autostart-xpad", &value, NULL);
969 	g_signal_handler_block (pref->priv->autostart_xpad, pref->priv->autostart_xpad_handler);
970 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_xpad), value);
971 	gtk_widget_set_sensitive (pref->priv->autostart_wait_systray, value);
972 	if (value)
973 		change_autostart_wait_systray (GTK_TOGGLE_BUTTON (pref->priv->autostart_wait_systray), pref);
974 	g_signal_handler_unblock (pref->priv->autostart_xpad, pref->priv->autostart_xpad_handler);
975 }
976 
977 static void
notify_autostart_wait_systray(XpadPreferences * pref)978 notify_autostart_wait_systray (XpadPreferences *pref)
979 {
980 	gboolean value;
981 	g_object_get (pref->priv->settings, "autostart-wait-systray", &value, NULL);
982 	g_signal_handler_block (pref->priv->autostart_wait_systray, pref->priv->autostart_wait_systray_handler);
983 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_wait_systray), value);
984 	g_signal_handler_unblock (pref->priv->autostart_wait_systray, pref->priv->autostart_wait_systray_handler);
985 }
986 
987 static void
notify_autostart_new_pad(XpadPreferences * pref)988 notify_autostart_new_pad (XpadPreferences *pref)
989 {
990 	gboolean value;
991 	g_object_get (pref->priv->settings, "autostart-new-pad", &value, NULL);
992 	g_signal_handler_block (pref->priv->autostart_new_pad, pref->priv->autostart_new_pad_handler);
993 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_new_pad), value);
994 	g_signal_handler_unblock (pref->priv->autostart_new_pad, pref->priv->autostart_new_pad_handler);
995 }
996 
997 static void
notify_autostart_sticky(XpadPreferences * pref)998 notify_autostart_sticky (XpadPreferences *pref)
999 {
1000 	gboolean value;
1001 	g_object_get (pref->priv->settings, "autostart-sticky", &value, NULL);
1002 	g_signal_handler_block (pref->priv->autostart_sticky, pref->priv->autostart_sticky_handler);
1003 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autostart_sticky), value);
1004 	g_signal_handler_unblock (pref->priv->autostart_sticky, pref->priv->autostart_sticky_handler);
1005 }
1006 
1007 static void
notify_autostart_delay(XpadPreferences * pref)1008 notify_autostart_delay (XpadPreferences *pref)
1009 {
1010 	guint value;
1011 	g_object_get (pref->priv->settings, "autostart-delay", &value, NULL);
1012 	g_signal_handler_block (pref->priv->autostart_delay, pref->priv->autostart_delay_handler);
1013 	gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->autostart_delay), value);
1014 	g_signal_handler_unblock (pref->priv->autostart_delay, pref->priv->autostart_delay_handler);
1015 }
1016 
1017 static void
notify_autostart_display_pads(XpadPreferences * pref)1018 notify_autostart_display_pads (XpadPreferences *pref)
1019 {
1020 	guint value;
1021 	g_object_get (pref->priv->settings, "autostart-display-pads", &value, NULL);
1022 	g_signal_handler_block (pref->priv->autostart_display_pads, pref->priv->autostart_display_pads_handler);
1023 	gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->autostart_display_pads), value);
1024 	g_signal_handler_unblock (pref->priv->autostart_display_pads, pref->priv->autostart_display_pads_handler);
1025 }
1026 
1027 static void
notify_tray_enabled(XpadPreferences * pref)1028 notify_tray_enabled (XpadPreferences *pref)
1029 {
1030 	gboolean value;
1031 	g_object_get (pref->priv->settings, "tray-enabled", &value, NULL);
1032 	g_signal_handler_block (pref->priv->tray_enabled, pref->priv->tray_enabled_handler);
1033 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->tray_enabled), value);
1034 	gtk_widget_set_sensitive (pref->priv->tray_click_configuration, value);
1035 	gtk_widget_set_sensitive (pref->priv->autostart_display_pads, value);
1036 	if (!value)
1037 		g_object_set (pref->priv->settings, "autostart-display-pads", 0, NULL);
1038 	g_signal_handler_unblock (pref->priv->tray_enabled, pref->priv->tray_enabled_handler);
1039 }
1040 
1041 static void
notify_tray_click(XpadPreferences * pref)1042 notify_tray_click (XpadPreferences *pref)
1043 {
1044 	guint value;
1045 	g_object_get (pref->priv->settings, "tray-click-configuration", &value, NULL);
1046 	g_signal_handler_block (pref->priv->tray_click_configuration, pref->priv->tray_click_handler);
1047 	gtk_combo_box_set_active (GTK_COMBO_BOX (pref->priv->tray_click_configuration), value);
1048 	g_signal_handler_unblock (pref->priv->tray_click_configuration, pref->priv->tray_click_handler);
1049 }
1050 
1051 static void
notify_edit(XpadPreferences * pref)1052 notify_edit (XpadPreferences *pref)
1053 {
1054 	gboolean value;
1055 	g_object_get (pref->priv->settings, "edit-lock", &value, NULL);
1056 	g_signal_handler_block (pref->priv->editcheck, pref->priv->editcheck_handler);
1057 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->editcheck), value);
1058 	g_signal_handler_unblock (pref->priv->editcheck, pref->priv->editcheck_handler);
1059 }
1060 
1061 static void
notify_confirm(XpadPreferences * pref)1062 notify_confirm (XpadPreferences *pref)
1063 {
1064 	gboolean value;
1065 	g_object_get (pref->priv->settings, "confirm-destroy", &value, NULL);
1066 	g_signal_handler_block (pref->priv->confirmcheck, pref->priv->confirmcheck_handler);
1067 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->confirmcheck), value);
1068 	g_signal_handler_unblock (pref->priv->confirmcheck, pref->priv->confirmcheck_handler);
1069 }
1070 
1071 static void
notify_has_decorations(XpadPreferences * pref)1072 notify_has_decorations (XpadPreferences *pref)
1073 {
1074 	gboolean value;
1075 	g_object_get (pref->priv->settings, "has-decorations", &value, NULL);
1076 	g_signal_handler_block (pref->priv->has_decorations, pref->priv->has_decorations_handler);
1077 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->has_decorations), value);
1078 	g_signal_handler_unblock (pref->priv->has_decorations, pref->priv->has_decorations_handler);
1079 }
1080 
1081 static void
notify_hide_from_taskbar(XpadPreferences * pref)1082 notify_hide_from_taskbar (XpadPreferences *pref)
1083 {
1084 	gboolean value;
1085 	g_object_get (pref->priv->settings, "hide-from-taskbar", &value, NULL);
1086 	g_signal_handler_block (pref->priv->hide_from_taskbar, pref->priv->hide_from_taskbar_handler);
1087 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->hide_from_taskbar), value);
1088 	g_signal_handler_unblock (pref->priv->hide_from_taskbar, pref->priv->hide_from_taskbar_handler);
1089 }
1090 
1091 static void
notify_hide_from_task_switcher(XpadPreferences * pref)1092 notify_hide_from_task_switcher (XpadPreferences *pref)
1093 {
1094 	gboolean value;
1095 	g_object_get (pref->priv->settings, "hide-from-task-switcher", &value, NULL);
1096 	g_signal_handler_block (pref->priv->hide_from_task_switcher, pref->priv->hide_from_task_switcher_handler);
1097 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->hide_from_task_switcher), value);
1098 	g_signal_handler_unblock (pref->priv->hide_from_task_switcher, pref->priv->hide_from_task_switcher_handler);
1099 }
1100 
1101 static void
notify_has_toolbar(XpadPreferences * pref)1102 notify_has_toolbar (XpadPreferences *pref)
1103 {
1104 	gboolean value;
1105 	g_object_get (pref->priv->settings, "has-toolbar", &value, NULL);
1106 	g_signal_handler_block (pref->priv->has_toolbar, pref->priv->has_toolbar_handler);
1107 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->has_toolbar), value);
1108 	gtk_widget_set_sensitive (pref->priv->autohide_toolbar, value);
1109 	g_signal_handler_unblock (pref->priv->has_toolbar, pref->priv->has_toolbar_handler);
1110 }
1111 
1112 static void
notify_autohide_toolbar(XpadPreferences * pref)1113 notify_autohide_toolbar (XpadPreferences *pref)
1114 {
1115 	gboolean value;
1116 	g_object_get (pref->priv->settings, "autohide-toolbar", &value, NULL);
1117 	g_signal_handler_block (pref->priv->autohide_toolbar, pref->priv->autohide_toolbar_handler);
1118 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->autohide_toolbar), value);
1119 	g_signal_handler_unblock (pref->priv->autohide_toolbar, pref->priv->autohide_toolbar_handler);
1120 }
1121 
1122 static void
notify_has_scrollbar(XpadPreferences * pref)1123 notify_has_scrollbar (XpadPreferences *pref)
1124 {
1125 	gboolean value;
1126 	g_object_get (pref->priv->settings, "has-scrollbar", &value, NULL);
1127 	g_signal_handler_block (pref->priv->has_scrollbar, pref->priv->has_scrollbar_handler);
1128 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pref->priv->has_scrollbar), value);
1129 	g_signal_handler_unblock (pref->priv->has_scrollbar, pref->priv->has_scrollbar_handler);
1130 }
1131