1 /*
2  * Xiphos Bible Study Tool
3  * preferences_dialog.c - get user preferences
4  *
5  * Copyright (C) 2000-2020 Xiphos Developer Team
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21 
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <unistd.h>
29 #include <string.h>
30 
31 #include <gtk/gtk.h>
32 #include <gtk/gtk.h>
33 #ifndef USE_GTKBUILDER
34 #include <glade/glade-xml.h>
35 #endif
36 
37 #include "gui/bibletext.h"
38 #include "gui/dialog.h"
39 #include "gui/xiphos.h"
40 #include "gui/preferences_dialog.h"
41 #include "gui/utilities.h"
42 #include "gui/gbs.h"
43 #include "gui/commentary.h"
44 #include "gui/dictlex.h"
45 #include "gui/parallel_view.h"
46 #include "gui/main_menu.h"
47 #include "gui/main_window.h"
48 #include "gui/sidebar.h"
49 #include "gui/tabbed_browser.h"
50 #include "gui/widgets.h"
51 #include "gui/font_dialog.h"
52 
53 #include "main/sword.h"
54 #include "main/lists.h"
55 #include "main/mod_mgr.h"
56 #include "main/previewer.h"
57 #include "main/parallel_view.h"
58 #include "main/settings.h"
59 #include "main/sidebar.h"
60 #include "main/xml.h"
61 #include "main/url.hh"
62 #include "main/biblesync_glue.h"
63 
64 #include "gui/debug_glib_null.h"
65 
66 typedef struct _preferences_combo COMBOBOXS;
67 struct _preferences_combo
68 {
69 	GtkWidget *default_dictionary_module;
70 	GtkWidget *percomm_module;
71 	GtkWidget *devotion_module;
72 	GtkWidget *greek_lex__module;
73 	GtkWidget *hebrew_lex__module;
74 	GtkWidget *combo_entry_sp_dir;
75 	GtkWidget *base_font_size;
76 	GtkWidget *verse_number_size;
77 	GtkWidget *special_locale;
78 	GtkWidget *font_prefs;
79 };
80 
81 typedef struct _preferences_color_pickers COLOR_PICKERS;
82 struct _preferences_color_pickers
83 {
84 	GtkWidget *text;
85 	GtkWidget *text_background;
86 	GtkWidget *text_current_verse;
87 	GtkWidget *verse_numbers;
88 	GtkWidget *href_links;
89 	GtkWidget *highlight_fg;
90 	GtkWidget *highlight_bg;
91 	GtkWidget *invert_normal;
92 	GtkWidget *invert_highlight;
93 };
94 
95 typedef struct _preferences_check_buttons CHECK_BUTTONS;
96 struct _preferences_check_buttons
97 {
98 	GtkWidget *use_defaults; /* radio button */
99 
100 	GtkWidget *use_default_dictionary;
101 	GtkWidget *use_linked_tabs;
102 	GtkWidget *use_chapter_scroll;
103 	GtkWidget *use_imageresize;
104 	GtkWidget *use_verse_num_bold;
105 	GtkWidget *use_verse_num_bracket;
106 	GtkWidget *use_verse_num_superscript;
107 	GtkWidget *readaloud;
108 	GtkWidget *show_verse_num;
109 	GtkWidget *versehighlight;
110 	GtkWidget *annotate_highlight;
111 	GtkWidget *xrefs_in_verse_list;
112 	GtkWidget *show_splash_screen;
113 	GtkWidget *prayerlist;
114 	GtkWidget *statusbar;
115 	GtkWidget *alternation;
116 
117 	GtkWidget *show_in_viewer;
118 	GtkWidget *show_in_dictionary;
119 	GtkWidget *show_devotion;
120 
121 	GtkWidget *bs_debug;
122 	GtkWidget *bs_presence;
123 	GtkWidget *bs_mismatch;
124 	GtkWidget *bs_group_tab;
125 	GtkWidget *bs_keyboard;
126 	GtkWidget *bs_privacy;
127 };
128 
129 typedef struct _preferences_radio_buttons RADIO_BUTTONS;
130 struct _preferences_radio_buttons
131 {
132 	/* BibleSync mode selection */
133 	GtkWidget *bs_mode_off;
134 	GtkWidget *bs_mode_personal;
135 	GtkWidget *bs_mode_speaker;
136 	GtkWidget *bs_mode_audience;
137 
138 	/* BibleSync navigation choice */
139 	GtkWidget *bs_nav_direct;
140 	GtkWidget *bs_nav_verselist;
141 
142 	/* BibleSync listener choice. */
143 	GtkWidget *bs_listen_some;
144 	GtkWidget *bs_listen_all;
145 	GtkWidget *bs_listen_none;
146 };
147 
148 /* fixed callback values, for radio button assignment. */
149 static int rb_cb[] = {0, 1, 2, 3}; // userdata callback values.
150 
151 typedef struct _preferences_buttons BUTTONS;
152 struct _preferences_buttons
153 {
154 	GtkWidget *xiphos_defaults;
155 };
156 
157 typedef struct _parallel_select PARALLEL_SELECT;
158 struct _parallel_select
159 {
160 	GtkWidget *button_clear;
161 	GtkWidget *button_cut;
162 	GtkWidget *button_add;
163 	GtkWidget *listview;
164 	GtkWidget *mod_sel_dialog;
165 	GtkWidget *mod_sel_close;
166 	GtkWidget *mod_sel_add;
167 	GtkWidget *mod_sel_treeview;
168 };
169 static GtkWidget *dialog_prefs = NULL;
170 
171 GtkWidget *speaker_window = NULL; // BibleSync
172 GtkWidget *speaker_list = NULL;   // BibleSync
173 
174 /*****************************************************************************
175  * externs
176  */
177 extern gchar *tmpcolor;
178 
179 /******************************************************************************
180  * static - visible to this file only
181  */
182 static GtkWidget *notebook;
183 static COMBOBOXS combo;
184 static COLOR_PICKERS color_picker;
185 static CHECK_BUTTONS check_button;
186 static RADIO_BUTTONS radio_button;
187 static PARALLEL_SELECT parallel_select;
188 
189 /******************************************************************************
190  * Name
191  *   on_prefs_configure_event
192  *
193  * Synopsis
194  *   #include "gui/main_window.h"
195  *   gboolean on_prefs_configure_event(GtkWidget * widget,
196  *				   GdkEventConfigure * event,
197  *				   gpointer user_data)
198  *
199  * Description
200  *   remember placement+size of prefs window.
201  *   cloned from on_parallel_configure_event
202  *
203  * Return value
204  *   gboolean
205  */
206 
on_prefs_configure_event(GtkWidget * widget,GdkEventConfigure * event,gpointer user_data)207 static gboolean on_prefs_configure_event(GtkWidget *widget,
208 					 GdkEventConfigure *event,
209 					 gpointer user_data)
210 {
211 	gchar layout[10];
212 	gint x;
213 	gint y;
214 
215 	gdk_window_get_root_origin(GDK_WINDOW(gtk_widget_get_window(dialog_prefs)),
216 				   &x, &y);
217 
218 	settings.prefs_width = event->width;
219 	settings.prefs_height = event->height;
220 	settings.prefs_x = x;
221 	settings.prefs_y = y;
222 
223 	sprintf(layout, "%d", settings.prefs_width);
224 	xml_set_value("Xiphos", "layout", "prefs_width", layout);
225 
226 	sprintf(layout, "%d", settings.prefs_height);
227 	xml_set_value("Xiphos", "layout", "prefs_height", layout);
228 
229 	sprintf(layout, "%d", settings.prefs_x);
230 	xml_set_value("Xiphos", "layout", "prefs_x", layout);
231 
232 	sprintf(layout, "%d", settings.prefs_y);
233 	xml_set_value("Xiphos", "layout", "prefs_y", layout);
234 	xml_save_settings_doc(settings.fnconfigure);
235 
236 	return FALSE;
237 }
238 
239 /******************************************************************************
240  * Name
241  *  string_is_color
242  *
243  * Synopsis
244  *   #include "preferences_dialog.h"
245  *   gint string_is_color(gchar * color)
246  *
247  * Description
248  *    this code is from bluefish-0.6
249  *
250  * Return value
251  *   gint
252  */
253 #if !GTK_CHECK_VERSION(3, 4, 0)
string_is_color(gchar * color)254 static gint string_is_color(gchar *color)
255 {
256 	gint i;
257 
258 	if (!color) {
259 		XI_warning(("string_is_color, pointer NULL\n"));
260 		return 0;
261 	}
262 	if (strlen(color) != 7) {
263 		XI_warning(("string_is_color, strlen(%s) != 7\n", color));
264 		return 0;
265 	}
266 	if (color[0] != '#') {
267 		XI_warning(("string_is_color, 0 in %s is not #\n", color));
268 		return 0;
269 	}
270 	for (i = 1; i < 7; i++) {
271 		if ((color[i] > 102) ||
272 		    (color[i] < 48) ||
273 		    ((color[i] > 57) && (color[i] < 65)) ||
274 		    ((color[i] > 70) && (color[i] < 97))) {
275 			XI_warning(("string_is_color, %d in %s is not from a color, it is %d\n",
276 				    i, color, color[i]));
277 			return 0;
278 		}
279 	}
280 	XI_print(("string_is_color, %s is color\n", color));
281 	return 1;
282 }
283 #endif
284 
285 #if GTK_CHECK_VERSION(3, 4, 0)
gdkrgba_to_hex(GdkRGBA * color)286 static gchar *gdkrgba_to_hex(GdkRGBA *color)
287 {
288 	gchar *tmpstr;
289 
290 	tmpstr = g_malloc(8 * sizeof(char));
291 	g_snprintf(tmpstr, 8, "#%.2X%.2X%.2X",
292 		   (unsigned int)(color->red * 255),
293 		   (unsigned int)(color->green * 255),
294 		   (unsigned int)(color->blue * 255));
295 	return tmpstr;
296 }
297 
298 #else
299 /******************************************************************************
300  * Name
301  *  gdkcolor_to_hex
302  *
303  * Synopsis
304  *   #include "preferences_dialog.h"
305  *   gchar *gdkcolor_to_hex(gdouble * color, gint websafe)
306  *
307  * Description
308  *    this code is from bluefish-1.0.2
309  *
310  * Return value
311  *   gchar *
312  */
313 
gdkcolor_to_hex(GdkColor color,gint websafe)314 static gchar *gdkcolor_to_hex(GdkColor color, gint websafe)
315 {
316 	gchar *tmpstr;
317 
318 	tmpstr = g_malloc(8 * sizeof(char));
319 	if (websafe) {
320 		g_snprintf(tmpstr, 8, "#%.2X%.2X%.2X",
321 			   (0x33 * color.red / (256 * 0x33)),
322 			   (0x33 * color.green / (256 * 0x33)),
323 			   (0x33 * color.blue / (256 * 0x33)));
324 	} else {
325 		g_snprintf(tmpstr, 8, "#%.2X%.2X%.2X",
326 			   color.red / 256,
327 			   color.green / 256, color.blue / 256);
328 	}
329 	return tmpstr;
330 }
331 
332 #endif
333 
apply_color_settings(void)334 void apply_color_settings(void)
335 {
336 	if (settings.havebible) {
337 		main_display_bible(settings.MainWindowModule,
338 				   settings.currentverse);
339 		main_update_parallel_page();
340 	}
341 	if (settings.havecomm)
342 		main_display_commentary(settings.CommWindowModule,
343 					settings.currentverse);
344 	if (settings.havebook)
345 		main_display_book(settings.book_mod, settings.book_key);
346 	if (settings.havedict)
347 		main_display_dictionary(settings.DictWindowModule,
348 					settings.dictkey);
349 	main_init_previewer();
350 }
351 
352 /******************************************************************************
353  * Name
354  *   invert_colors
355  *
356  * Synopsis
357  *   #include "preferences_dialog.h"
358  *   void invert_colors(char **color1, char *label1,
359 		        char **color2, char *label2)
360  *
361  * Description
362  *   parameterized color selector inversion.  called from on_invert().
363  *
364  * Return value
365  *   void
366  */
367 
invert_colors(char ** color1,char * label1,char ** color2,char * label2)368 void invert_colors(char **color1, char *label1,
369 		   char **color2, char *label2)
370 {
371 	char *hold = *color1;
372 	*color1 = *color2;
373 	*color2 = hold;
374 
375 	xml_set_value("Xiphos", "HTMLcolors", label1, *color1);
376 	xml_set_value("Xiphos", "HTMLcolors", label2, *color2);
377 
378 	setup_color_pickers();
379 	apply_color_settings();
380 }
381 
382 /******************************************************************************
383  * Name
384  *   on_invert
385  *
386  * Synopsis
387  *   #include "preferences_dialog.h"
388  *   void on_invert(GtkWidget *button, gchar *user_data)
389  *
390  * Description
391  *   invokes swap of normal or highlight foreground/background
392  *
393  * Return value
394  *   void
395  */
396 
on_invert(GtkWidget * button,gchar * user_data)397 void on_invert(GtkWidget *button, gchar *user_data)
398 {
399 	if (user_data)
400 		invert_colors(&settings.bible_bg_color, "background",
401 			      &settings.bible_text_color, "text_fg");
402 	else
403 		invert_colors(&settings.highlight_fg, "highlight_fg",
404 			      &settings.highlight_bg, "highlight_bg");
405 }
406 
407 /******************************************************************************
408  * Name
409  *   on_colorbutton1_color_set
410  *
411  * Synopsis
412  *   #include "preferences_dialog.h"
413  *   void on_colorbutton1_color_set(GtkColorButton  * colorbutton,
414  *							gpointer user_data)
415  *
416  * Description
417  *
418  * Return value
419  *   void
420  */
421 
422 void
on_colorbutton1_color_set(GtkColorButton * colorbutton,gpointer user_data)423 on_colorbutton1_color_set(GtkColorButton *colorbutton, gpointer user_data)
424 {
425 	gchar *buf = NULL;
426 #if GTK_CHECK_VERSION(3, 4, 0)
427 	GdkRGBA color;
428 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
429 				   &color);
430 	buf = gdkrgba_to_hex(&color); //gdk_rgba_to_string (&color);
431 #else
432 	GdkColor color;
433 	gtk_color_button_get_color(colorbutton, &color);
434 	buf = gdkcolor_to_hex(color, 1);
435 #endif
436 	xml_set_value("Xiphos", "HTMLcolors", "background", buf);
437 	settings.bible_bg_color =
438 	    xml_get_value("HTMLcolors", "background");
439 	if (buf)
440 		g_free(buf);
441 	apply_color_settings();
442 }
443 
444 /******************************************************************************
445  * Name
446  *   on_colorbutton2_color_set
447  *
448  * Synopsis
449  *   #include "preferences_dialog.h"
450  *   void on_colorbutton2_color_set(GtkColorButton  * colorbutton,
451  *							gpointer user_data)
452  *
453  * Description
454  *
455  * Return value
456  *   void
457  */
458 
459 void
on_colorbutton2_color_set(GtkColorButton * colorbutton,gpointer user_data)460 on_colorbutton2_color_set(GtkColorButton *colorbutton, gpointer user_data)
461 {
462 	gchar *buf2 = NULL;
463 #if GTK_CHECK_VERSION(3, 4, 0)
464 	GdkRGBA color;
465 
466 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
467 				   &color);
468 	buf2 = gdkrgba_to_hex(&color);
469 #else
470 	GdkColor color;
471 
472 	gtk_color_button_get_color(colorbutton, &color);
473 	buf2 = gdkcolor_to_hex(color, 1);
474 #endif
475 	xml_set_value("Xiphos", "HTMLcolors", "text_fg", buf2);
476 	settings.bible_text_color = xml_get_value("HTMLcolors", "text_fg");
477 	if (buf2)
478 		g_free(buf2);
479 	apply_color_settings();
480 }
481 
482 /******************************************************************************
483  * Name
484  *   on_colorbutton3_color_set
485  *
486  * Synopsis
487  *   #include "preferences_dialog.h"
488  *   void on_colorbutton3_color_set(GtkColorButton  * colorbutton,
489  *							gpointer user_data)
490  *
491  * Description
492  *
493  * Return value
494  *   void
495  */
496 
497 void
on_colorbutton3_color_set(GtkColorButton * colorbutton,gpointer user_data)498 on_colorbutton3_color_set(GtkColorButton *colorbutton, gpointer user_data)
499 {
500 	gchar *buf2 = NULL;
501 #if GTK_CHECK_VERSION(3, 4, 0)
502 	GdkRGBA color;
503 
504 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
505 				   &color);
506 	buf2 = gdkrgba_to_hex(&color);
507 #else
508 	GdkColor color;
509 
510 	gtk_color_button_get_color(colorbutton, &color);
511 	buf2 = gdkcolor_to_hex(color, 1);
512 #endif
513 	xml_set_value("Xiphos", "HTMLcolors", "currentverse", buf2);
514 	settings.currentverse_color =
515 	    xml_get_value("HTMLcolors", "currentverse");
516 	if (buf2)
517 		g_free(buf2);
518 	apply_color_settings();
519 }
520 
521 /******************************************************************************
522  * Name
523  *   on_colorbutton4_color_set
524  *
525  * Synopsis
526  *   #include "preferences_dialog.h"
527  *   void on_colorbutton4_color_set(GtkColorButton  * colorbutton,
528  *							gpointer user_data)
529  *
530  * Description
531  *
532  * Return value
533  *   void
534  */
535 
536 void
on_colorbutton4_color_set(GtkColorButton * colorbutton,gpointer user_data)537 on_colorbutton4_color_set(GtkColorButton *colorbutton, gpointer user_data)
538 {
539 	gchar *buf2 = NULL;
540 #if GTK_CHECK_VERSION(3, 4, 0)
541 	GdkRGBA color;
542 
543 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
544 				   &color);
545 	buf2 = gdkrgba_to_hex(&color);
546 #else
547 	GdkColor color;
548 
549 	gtk_color_button_get_color(colorbutton, &color);
550 	buf2 = gdkcolor_to_hex(color, 1);
551 #endif
552 	xml_set_value("Xiphos", "HTMLcolors", "versenum", buf2);
553 	settings.bible_verse_num_color =
554 	    xml_get_value("HTMLcolors", "versenum");
555 	if (buf2)
556 		g_free(buf2);
557 	apply_color_settings();
558 }
559 
560 /******************************************************************************
561  * Name
562  *   on_colorbutton5_color_set
563  *
564  * Synopsis
565  *   #include "preferences_dialog.h"
566  *   void on_colorbutton5_color_set(GtkColorButton  * colorbutton,
567  *							gpointer user_data)
568  *
569  * Description
570  *
571  * Return value
572  *   void
573  */
574 
575 void
on_colorbutton5_color_set(GtkColorButton * colorbutton,gpointer user_data)576 on_colorbutton5_color_set(GtkColorButton *colorbutton, gpointer user_data)
577 {
578 	gchar *buf2 = NULL;
579 #if GTK_CHECK_VERSION(3, 4, 0)
580 	GdkRGBA color;
581 
582 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
583 				   &color);
584 	buf2 = gdkrgba_to_hex(&color);
585 #else
586 	GdkColor color;
587 
588 	gtk_color_button_get_color(colorbutton, &color);
589 	buf2 = gdkcolor_to_hex(color, 1);
590 #endif
591 	xml_set_value("Xiphos", "HTMLcolors", "link", buf2);
592 	settings.link_color = xml_get_value("HTMLcolors", "link");
593 	if (buf2)
594 		g_free(buf2);
595 	apply_color_settings();
596 }
597 
598 /******************************************************************************
599  * Name
600  *   on_colorbutton6_color_set
601  *
602  * Synopsis
603  *   #include "preferences_dialog.h"
604  *   void on_colorbutton6_color_set(GtkColorButton  * colorbutton,
605  *							gpointer user_data)
606  *
607  * Description
608  *
609  * Return value
610  *   void
611  */
612 
613 void
on_colorbutton6_color_set(GtkColorButton * colorbutton,gpointer user_data)614 on_colorbutton6_color_set(GtkColorButton *colorbutton, gpointer user_data)
615 {
616 	gchar *buf2 = NULL;
617 #if GTK_CHECK_VERSION(3, 4, 0)
618 	GdkRGBA color;
619 
620 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
621 				   &color);
622 	buf2 = gdkrgba_to_hex(&color);
623 #else
624 	GdkColor color;
625 
626 	gtk_color_button_get_color(colorbutton, &color);
627 	buf2 = gdkcolor_to_hex(color, 1);
628 #endif
629 	xml_set_value("Xiphos", "HTMLcolors", "highlight_fg", buf2);
630 	settings.highlight_fg =
631 	    xml_get_value("HTMLcolors", "highlight_fg");
632 	if (buf2)
633 		g_free(buf2);
634 	apply_color_settings();
635 }
636 
637 /******************************************************************************
638  * Name
639  *   on_colorbutton7_color_set
640  *
641  * Synopsis
642  *   #include "preferences_dialog.h"
643  *   void on_colorbutton7_color_set(GtkColorButton  * colorbutton,
644  *							gpointer user_data)
645  *
646  * Description
647  *
648  * Return value
649  *   void
650  */
651 
652 void
on_colorbutton7_color_set(GtkColorButton * colorbutton,gpointer user_data)653 on_colorbutton7_color_set(GtkColorButton *colorbutton, gpointer user_data)
654 {
655 	gchar *buf2 = NULL;
656 #if GTK_CHECK_VERSION(3, 4, 0)
657 	GdkRGBA color;
658 
659 	gtk_color_chooser_get_rgba((GtkColorChooser *)colorbutton,
660 				   &color);
661 	buf2 = gdkrgba_to_hex(&color);
662 #else
663 	GdkColor color;
664 
665 	gtk_color_button_get_color(colorbutton, &color);
666 	buf2 = gdkcolor_to_hex(color, 1);
667 #endif
668 	xml_set_value("Xiphos", "HTMLcolors", "highlight_bg", buf2);
669 	settings.highlight_bg =
670 	    xml_get_value("HTMLcolors", "highlight_bg");
671 	if (buf2)
672 		g_free(buf2);
673 	apply_color_settings();
674 }
675 
676 /******************************************************************************
677  * Name
678  *   on_checkbutton1_toggled
679  *
680  * Synopsis
681  *   #include "preferences_dialog.h"
682  *   void on_checkbutton1_toggled(GtkToggleButton * togglebutton, gpointer user_data)
683  *
684  * Description
685  *
686  * Return value
687  *   void
688  */
689 
690 void
on_checkbutton1_toggled(GtkToggleButton * togglebutton,gpointer user_data)691 on_checkbutton1_toggled(GtkToggleButton *togglebutton, gpointer user_data)
692 {
693 	gui_tabs_on_off(gtk_toggle_button_get_active(togglebutton));
694 	/*	if (togglebutton->active) {
695 		xml_set_value("Xiphos", "tabs", "browsing", "1");
696 		settings.browsing = TRUE;
697 		gui_open_tabs();
698 		gtk_widget_show(widgets.hboxtb);
699 	} else {
700 		xml_set_value("Xiphos", "tabs", "browsing", "0");
701 		gtk_widget_hide(widgets.hboxtb);
702 		settings.browsing = FALSE;
703 		gui_close_all_tabs();
704 	}
705 	settings.browsing = atoi(xml_get_value("tabs", "browsing"));
706 	*/
707 }
708 
709 /******************************************************************************
710  * Name
711  *   on_checkbutton2_toggled
712  *
713  * Synopsis
714  *   #include "preferences_dialog.h"
715  *   void on_checkbutton2_toggled(GtkToggleButton * togglebutton, gpointer user_data)
716  *
717  * Description
718  *
719  * Return value
720  *   void
721  */
722 
723 void
on_checkbutton2_toggled(GtkToggleButton * togglebutton,gpointer user_data)724 on_checkbutton2_toggled(GtkToggleButton *togglebutton, gpointer user_data)
725 {
726 	if (gtk_toggle_button_get_active(togglebutton))
727 		xml_set_value("Xiphos", "misc", "showtexts", "1");
728 	else
729 		xml_set_value("Xiphos", "misc", "showtexts", "0");
730 	settings.showtexts = atoi(xml_get_value("misc", "showtexts"));
731 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewtexts_item),
732 				       settings.showtexts);
733 	gui_show_hide_texts(gtk_toggle_button_get_active(togglebutton));
734 }
735 
736 /******************************************************************************
737  * Name
738  *   on_checkbutton3_toggled
739  *
740  * Synopsis
741  *   #include "preferences_dialog.h"
742  *   void on_checkbutton3_toggled(GtkToggleButton * togglebutton, gpointer user_data)
743  *
744  * Description
745  *
746  * Return value
747  *   void
748  */
749 
750 void
on_checkbutton3_toggled(GtkToggleButton * togglebutton,gpointer user_data)751 on_checkbutton3_toggled(GtkToggleButton *togglebutton, gpointer user_data)
752 {
753 	if (gtk_toggle_button_get_active(togglebutton))
754 		xml_set_value("Xiphos", "misc", "showcomms", "1");
755 	else
756 		xml_set_value("Xiphos", "misc", "showcomms", "0");
757 	settings.showcomms = atoi(xml_get_value("misc", "showcomms"));
758 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewcomms_item),
759 				       settings.showcomms);
760 	gui_show_hide_comms(gtk_toggle_button_get_active(togglebutton));
761 }
762 
763 /******************************************************************************
764  * Name
765  *   on_checkbutton9_toggled
766  *
767  * Synopsis
768  *   #include "preferences_dialog.h"
769  *   void on_checkbutton9_toggled(GtkToggleButton * togglebutton, gpointer user_data)
770  *
771  * Description
772  *
773  * Return value
774  *   void
775  */
776 
777 void
on_checkbutton9_toggled(GtkToggleButton * togglebutton,gpointer user_data)778 on_checkbutton9_toggled(GtkToggleButton *togglebutton, gpointer user_data)
779 {
780 	if (gtk_toggle_button_get_active(togglebutton))
781 		xml_set_value("Xiphos", "misc", "showpreview", "1");
782 	else
783 		xml_set_value("Xiphos", "misc", "showpreview", "0");
784 	settings.showpreview = atoi(xml_get_value("misc", "showpreview"));
785 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewpreview_item),
786 				       settings.showpreview);
787 	gui_show_hide_preview(gtk_toggle_button_get_active(togglebutton));
788 }
789 
790 /******************************************************************************
791  * Name
792  *   on_checkbutton4_toggled
793  *
794  * Synopsis
795  *   #include "preferences_dialog.h"
796  *   void on_checkbutton4_toggled(GtkToggleButton * togglebutton, gpointer user_data)
797  *
798  * Description
799  *
800  * Return value
801  *   void
802  */
803 
804 void
on_checkbutton4_toggled(GtkToggleButton * togglebutton,gpointer user_data)805 on_checkbutton4_toggled(GtkToggleButton *togglebutton, gpointer user_data)
806 {
807 	if (gtk_toggle_button_get_active(togglebutton))
808 		xml_set_value("Xiphos", "misc", "showdicts", "1");
809 	else
810 		xml_set_value("Xiphos", "misc", "showdicts", "0");
811 	settings.showdicts = atoi(xml_get_value("misc", "showdicts"));
812 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewdicts_item),
813 				       settings.showdicts);
814 	gui_show_hide_dicts(gtk_toggle_button_get_active(togglebutton));
815 }
816 
817 /******************************************************************************
818  * Name
819  *   on_checkbutton10_toggled
820  *
821  * Synopsis
822  *   #include "preferences_dialog.h"
823  *   void on_checkbutton10_toggled(GtkToggleButton * togglebutton, gpointer user_data)
824  *
825  * Description
826  *
827  * Return value
828  *   void
829  */
830 
831 void
on_checkbutton10_toggled(GtkToggleButton * togglebutton,gpointer user_data)832 on_checkbutton10_toggled(GtkToggleButton *togglebutton,
833 			 gpointer user_data)
834 {
835 	xml_set_value("Xiphos", "misc", "pinnedtabs",
836 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
837 	settings.linkedtabs = atoi(xml_get_value("misc", "pinnedtabs"));
838 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.linkedtabs_item),
839 				       settings.linkedtabs);
840 }
841 
842 /******************************************************************************
843  * Name
844  *   on_biblesync_obtain_passphrase
845  *
846  * Synopsis
847  *   #include "unlock_key_dialog.h"
848  *   gchar *on_biblesync_obtain_passphrase()
849  *
850  * Description
851  *   create dialog to get session passphrase
852  *
853  * Return value
854  *   void
855  */
856 
on_biblesync_obtain_passphrase()857 gchar *on_biblesync_obtain_passphrase()
858 {
859 	gchar *retval;
860 	GS_DIALOG *info = gui_new_dialog();
861 #if GTK_CHECK_VERSION(3, 10, 0)
862 	info->stock_icon = g_strdup("dialog-warning");
863 #else
864 	info->stock_icon = g_strdup(GTK_STOCK_DIALOG_WARNING);
865 #endif
866 	info->label_top = g_strdup(_("BibleSync session passphrase"));
867 	info->text1 = g_strdup(biblesync_get_passphrase());
868 	info->label1 = _("Phrase:");
869 	info->ok = TRUE;
870 
871 	(void)gui_gs_dialog(info);
872 
873 	retval = g_strdup(info->text1);
874 	g_free(info->label_top);
875 	g_free(info->text1);
876 	g_free(info);
877 	return retval;
878 }
879 
880 /******************************************************************************
881  * Name
882  *   on_checkbutton_biblesync_toggled
883  *
884  * Synopsis
885  *   #include "preferences_dialog.h"
886  *   void on_checkbutton_biblesync_toggled(GtkToggleButton * togglebutton, gpointer user_data)
887  *   *((int*)user_data) is settings' bs_* bitflag.
888  *
889  * Description
890  *   handle toggle of these biblesync flags:
891  *   keyboard, privacy, presence, mismatch, debug (packet dump), group/tab.
892  *
893  * Return value
894  *   void
895  */
896 
897 static void
on_checkbutton_biblesync_toggled(GtkToggleButton * togglebutton,gpointer user_data)898 on_checkbutton_biblesync_toggled(GtkToggleButton *togglebutton,
899 				 gpointer user_data)
900 {
901 	*((int *)user_data) = gtk_toggle_button_get_active(togglebutton);
902 	if (user_data == &settings.bs_privacy)
903 		biblesync_privacy(settings.bs_privacy);
904 }
905 
906 /******************************************************************************
907  * Name
908  *   on_radiobutton_biblesync_mode
909  *
910  * Synopsis
911  *   #include "preferences_dialog.h"
912  *   void on_radiobutton_biblesync_mode(GtkToggleButton * togglebutton, gpointer user_data)
913  *   *((int*)user_data) is settings.bs_mode's selection.
914  *
915  * Description
916  *   BibleSync mode selection, 0-3.
917  *
918  * Return value
919  *   void
920  */
921 
922 static void
on_radiobutton_biblesync_mode(GtkToggleButton * togglebutton,gpointer user_data)923 on_radiobutton_biblesync_mode(GtkToggleButton *togglebutton,
924 			      gpointer user_data)
925 {
926 	if (gtk_toggle_button_get_active(togglebutton)) {
927 		settings.bs_mode = *((int *)user_data);
928 
929 		if (settings.bs_mode != 0) {
930 			g_free(settings.bs_passphrase);
931 			settings.bs_passphrase =
932 			    on_biblesync_obtain_passphrase();
933 		}
934 		int new_mode = biblesync_mode_select(settings.bs_mode,
935 						     settings.bs_passphrase);
936 		/* selecting active mode enables polled receiver. */
937 
938 		if (new_mode != settings.bs_mode) {
939 			/* mode selection failed? probably dead interface */
940 			gui_generic_warning(_("Mode selection failed.\n"
941 					      "Set \"Debug\" and try "
942 					      "again to see why."));
943 			settings.bs_mode = new_mode;
944 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_off),
945 						     (settings.bs_mode == 0));
946 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_personal),
947 						     (settings.bs_mode == 1));
948 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_speaker),
949 						     (settings.bs_mode == 2));
950 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_audience),
951 						     (settings.bs_mode == 3));
952 		}
953 
954 		gtk_widget_set_sensitive(check_button.bs_keyboard,
955 					 ((settings.bs_mode == 1) || (settings.bs_mode == 2)));
956 
957 		if (biblesync_personal()) {
958 			gtk_widget_set_sensitive(check_button.bs_privacy, TRUE);
959 			on_checkbutton_biblesync_toggled(GTK_TOGGLE_BUTTON(check_button.bs_privacy),
960 							 &settings.bs_privacy);
961 		} else {
962 			gtk_widget_set_sensitive(check_button.bs_privacy, FALSE);
963 		}
964 	}
965 }
966 
967 /******************************************************************************
968  * Name
969  *   on_biblesync_kbd
970  *
971  * Synopsis
972  *   #include "preferences_dialog.h"
973  *   void on_biblesync_kbd(int mode)
974  *
975  * Description
976  *   kbd-selected biblesync mode.
977  *   as elsewhere: 0 = off; 1 = personal; 2 = speaker; 3 = audience.
978  *
979  * Return value
980  *   void
981  */
982 
on_biblesync_kbd(int mode)983 void on_biblesync_kbd(int mode)
984 {
985 	int new_mode;
986 
987 	settings.bs_mode = mode;
988 	new_mode = biblesync_mode_select(settings.bs_mode,
989 					 settings.bs_passphrase);
990 
991 	if (new_mode != settings.bs_mode) {
992 		gui_generic_warning(_("Mode selection failed.\n"));
993 		settings.bs_mode = new_mode;
994 	} else {
995 		gchar *msg = g_strdup_printf(_("BibleSync: %s (passphrase \"%s\")."),
996 					     ((mode == 0)
997 						  ? _("Disabled")
998 						  : ((mode == 1)
999 							 ? _("Personal")
1000 							 : ((mode == 2)
1001 								? _("Speaker")
1002 								: _("Audience")))),
1003 					     settings.bs_passphrase);
1004 		gui_set_statusbar(msg);
1005 		g_free(msg);
1006 	}
1007 }
1008 
1009 /******************************************************************************
1010  * Name
1011  *   on_radiobutton_biblesync_nav
1012  *
1013  * Synopsis
1014  *   #include "preferences_dialog.h"
1015  *   void on_radiobutton_biblesync_nav(GtkToggleButton * togglebutton,
1016  *				       gpointer user_data)
1017  *   *((int*)user_data) is settings.bs_navdirect's T|F selection.
1018  *
1019  * Description
1020  *   BibleSync nav selection, direct (1) or verse list (0).
1021  *
1022  * Return value
1023  *   void
1024  */
1025 
1026 static void
on_radiobutton_biblesync_nav(GtkToggleButton * togglebutton,gpointer user_data)1027 on_radiobutton_biblesync_nav(GtkToggleButton *togglebutton,
1028 			     gpointer user_data)
1029 {
1030 	if (gtk_toggle_button_get_active(togglebutton))
1031 		settings.bs_navdirect = *((int *)user_data);
1032 }
1033 
1034 /******************************************************************************
1035  * Name
1036  *   on_radiobutton_biblesync_listen
1037  *
1038  * Synopsis
1039  *   #include "preferences_dialog.h"
1040  *   void on_radiobutton_biblesync_listen(GtkToggleButton * togglebutton,
1041  *					  gpointer user_data)
1042  *   *((int*)user_data) is settings.bs_listen_set's 0|1|2 selection.
1043  *
1044  * Description
1045  *   BibleSync listen set choice.  calls biblesync glue if necessary,
1046  *   to set or clear all listen bits.
1047  *
1048  * Return value
1049  *   void
1050  */
1051 
1052 static void
on_radiobutton_biblesync_listen(GtkToggleButton * togglebutton,gpointer user_data)1053 on_radiobutton_biblesync_listen(GtkToggleButton *togglebutton,
1054 				gpointer user_data)
1055 {
1056 	if (gtk_toggle_button_get_active(togglebutton)) {
1057 		settings.bs_listen_set = *((int *)user_data);
1058 
1059 		if (settings.bs_listen_set != 0) // not selective
1060 		{
1061 			biblesync_set_clear_all_listen((settings.bs_listen_set == 1)
1062 							   ? TRUE
1063 							   : FALSE);
1064 		}
1065 	}
1066 }
1067 
1068 /******************************************************************************
1069  * Name
1070  *   on_checkbutton11_toggled
1071  *
1072  * Synopsis
1073  *   #include "preferences_dialog.h"
1074  *   void on_checkbutton11_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1075  *
1076  * Description
1077  *
1078  * Return value
1079  *   void
1080  */
1081 
1082 void
on_checkbutton11_toggled(GtkToggleButton * togglebutton,gpointer user_data)1083 on_checkbutton11_toggled(GtkToggleButton *togglebutton,
1084 			 gpointer user_data)
1085 {
1086 	xml_set_value("Xiphos", "misc", "readaloud",
1087 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1088 	settings.readaloud = atoi(xml_get_value("misc", "readaloud"));
1089 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.readaloud_item),
1090 				       settings.readaloud);
1091 }
1092 
1093 /******************************************************************************
1094  * Name
1095  *   on_checkbutton12_toggled
1096  *
1097  * Synopsis
1098  *   #include "preferences_dialog.h"
1099  *   void on_checkbutton12_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1100  *
1101  * Description
1102  *
1103  * Return value
1104  *   void
1105  */
1106 
1107 void
on_checkbutton12_toggled(GtkToggleButton * togglebutton,gpointer user_data)1108 on_checkbutton12_toggled(GtkToggleButton *togglebutton,
1109 			 gpointer user_data)
1110 {
1111 	xml_set_value("Xiphos", "misc", "showversenum",
1112 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1113 	settings.showversenum =
1114 	    atoi(xml_get_value("misc", "showversenum"));
1115 
1116 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.showversenum_item),
1117 				       settings.showversenum);
1118 }
1119 
1120 /******************************************************************************
1121  * Name
1122  *   on_checkbutton6_toggled
1123  *
1124  * Synopsis
1125  *   #include "preferences_dialog.h"
1126  *   void on_checkbutton6_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1127  *
1128  * Description
1129  *
1130  * Return value
1131  *   void
1132  */
1133 
1134 void
on_checkbutton6_toggled(GtkToggleButton * togglebutton,gpointer user_data)1135 on_checkbutton6_toggled(GtkToggleButton *togglebutton, gpointer user_data)
1136 {
1137 	xml_set_value("Xiphos", "lexicons", "usedefaultdict",
1138 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1139 	settings.useDefaultDict =
1140 	    gtk_toggle_button_get_active(togglebutton);
1141 }
1142 
1143 /******************************************************************************
1144  * Name
1145  *   on_checkbutton7_toggled
1146  *
1147  * Synopsis
1148  *   #include "preferences_dialog.h"
1149  *   void on_checkbutton7_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1150  *
1151  * Description
1152  *
1153  * Return value
1154  *   void
1155  */
1156 
1157 void
on_checkbutton7_toggled(GtkToggleButton * togglebutton,gpointer user_data)1158 on_checkbutton7_toggled(GtkToggleButton *togglebutton, gpointer user_data)
1159 {
1160 	xml_set_value("Xiphos", "misc", "dailydevotional",
1161 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1162 	settings.showdevotional =
1163 	    gtk_toggle_button_get_active(togglebutton);
1164 }
1165 
1166 /******************************************************************************
1167  * Name
1168  *   on_checkbutton8_toggled
1169  *
1170  * Synopsis
1171  *   #include "preferences_dialog.h"
1172  *   void on_checkbutton8_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1173  *
1174  * Description
1175  *
1176  * Return value
1177  *   void
1178  */
1179 
1180 void
on_checkbutton8_toggled(GtkToggleButton * togglebutton,gpointer user_data)1181 on_checkbutton8_toggled(GtkToggleButton *togglebutton, gpointer user_data)
1182 {
1183 	xml_set_value("Xiphos", "misc", "splash",
1184 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1185 	settings.showsplash = gtk_toggle_button_get_active(togglebutton);
1186 }
1187 
1188 /******************************************************************************
1189  * Name
1190  *   on_checkbutton_scroll_toggled
1191  *
1192  * Synopsis
1193  *   #include "preferences_dialog.h"
1194  *   void on_checkbutton_scroll_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1195  *
1196  * Description
1197  *
1198  * Return value
1199  *   void
1200  */
1201 
1202 void
on_checkbutton_scroll_toggled(GtkToggleButton * togglebutton,gpointer user_data)1203 on_checkbutton_scroll_toggled(GtkToggleButton *togglebutton,
1204 			      gpointer user_data)
1205 {
1206 	xml_set_value("Xiphos", "misc", "chapter-scroll",
1207 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1208 	settings.chapter_scroll =
1209 	    gtk_toggle_button_get_active(togglebutton);
1210 }
1211 
1212 /******************************************************************************
1213  * Name
1214  *   on_checkbutton_imageresize_toggled
1215  *
1216  * Synopsis
1217  *   #include "preferences_dialog.h"
1218  *   void on_checkbutton_imageresize_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1219  *
1220  * Description
1221  *
1222  * Return value
1223  *   void
1224  */
1225 
1226 void
on_checkbutton_imageresize_toggled(GtkToggleButton * togglebutton,gpointer user_data)1227 on_checkbutton_imageresize_toggled(GtkToggleButton *togglebutton,
1228 				   gpointer user_data)
1229 {
1230 	xml_set_value("Xiphos", "misc", "imageresize",
1231 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1232 	settings.imageresize = gtk_toggle_button_get_active(togglebutton);
1233 }
1234 
1235 /******************************************************************************
1236  * Name
1237  *   on_checkbutton_verse_num_bold_toggled
1238  *
1239  * Synopsis
1240  *   #include "preferences_dialog.h"
1241  *   void on_checkbutton_verse_num_bold_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1242  *
1243  * Description
1244  *
1245  * Return value
1246  *   void
1247  */
1248 
1249 void
on_checkbutton_verse_num_bold_toggled(GtkToggleButton * togglebutton,gpointer user_data)1250 on_checkbutton_verse_num_bold_toggled(GtkToggleButton *togglebutton,
1251 				      gpointer user_data)
1252 {
1253 	xml_set_value("Xiphos", "misc", "verse_num_bold",
1254 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1255 	settings.verse_num_bold =
1256 	    atoi(xml_get_value("misc", "verse_num_bold"));
1257 	char *url = g_strdup_printf("sword:///%s", settings.currentverse);
1258 	main_url_handler(url, TRUE);
1259 	g_free(url);
1260 }
1261 
1262 /******************************************************************************
1263  * Name
1264  *   on_checkbutton_verse_num_bracket_toggled
1265  *
1266  * Synopsis
1267  *   #include "preferences_dialog.h"
1268  *   void on_checkbutton_verse_num_bracket_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1269  *
1270  * Description
1271  *
1272  * Return value
1273  *   void
1274  */
1275 
1276 void
on_checkbutton_verse_num_bracket_toggled(GtkToggleButton * togglebutton,gpointer user_data)1277 on_checkbutton_verse_num_bracket_toggled(GtkToggleButton *togglebutton,
1278 					 gpointer user_data)
1279 {
1280 	xml_set_value("Xiphos", "misc", "verse_num_bracket",
1281 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1282 	settings.verse_num_bracket =
1283 	    atoi(xml_get_value("misc", "verse_num_bracket"));
1284 	char *url = g_strdup_printf("sword:///%s", settings.currentverse);
1285 	main_url_handler(url, TRUE);
1286 	g_free(url);
1287 }
1288 
1289 /******************************************************************************
1290  * Name
1291  *   on_checkbutton_verse_num_superscript_toggled
1292  *
1293  * Synopsis
1294  *   #include "preferences_dialog.h"
1295  *   void on_checkbutton_verse_num_superscript_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1296  *
1297  * Description
1298  *
1299  * Return value
1300  *   void
1301  */
1302 
1303 void
on_checkbutton_verse_num_superscript_toggled(GtkToggleButton * togglebutton,gpointer user_data)1304 on_checkbutton_verse_num_superscript_toggled(GtkToggleButton *
1305 						 togglebutton,
1306 					     gpointer user_data)
1307 {
1308 	xml_set_value("Xiphos", "misc", "verse_num_superscript",
1309 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1310 	settings.verse_num_superscript =
1311 	    atoi(xml_get_value("misc", "verse_num_superscript"));
1312 	char *url = g_strdup_printf("sword:///%s", settings.currentverse);
1313 	main_url_handler(url, TRUE);
1314 	g_free(url);
1315 }
1316 
1317 /******************************************************************************
1318  * Name
1319  *   on_checkbutton_versehighlight_toggled
1320  *
1321  * Synopsis
1322  *   #include "preferences_dialog.h"
1323  *   void on_checkbutton_versehighlight_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1324  *
1325  * Description
1326  *
1327  * Return value
1328  *   void
1329  */
1330 
1331 void
on_checkbutton_versehighlight_toggled(GtkToggleButton * togglebutton,gpointer user_data)1332 on_checkbutton_versehighlight_toggled(GtkToggleButton *togglebutton,
1333 				      gpointer user_data)
1334 {
1335 	xml_set_value("Xiphos", "misc", "versehighlight",
1336 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1337 	settings.versehighlight =
1338 	    gtk_toggle_button_get_active(togglebutton);
1339 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.versehighlight_item),
1340 				       settings.versehighlight);
1341 	main_display_bible(settings.MainWindowModule,
1342 			   settings.currentverse);
1343 }
1344 
1345 /******************************************************************************
1346  * Name
1347  *   on_checkbutton_annotate_highlight_toggled
1348  *
1349  * Synopsis
1350  *   #include "preferences_dialog.h"
1351  *   void on_checkbutton_annotate_highlight_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1352  *
1353  * Description
1354  *   En/disable yellow highlight on user's verse annotations.
1355  *
1356  * Return value
1357  *   void
1358  */
1359 
1360 void
on_checkbutton_annotate_highlight_toggled(GtkToggleButton * togglebutton,gpointer user_data)1361 on_checkbutton_annotate_highlight_toggled(GtkToggleButton *togglebutton,
1362 					  gpointer user_data)
1363 {
1364 	xml_set_value("Xiphos", "misc", "annotatehighlight",
1365 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1366 	settings.annotate_highlight =
1367 	    gtk_toggle_button_get_active(togglebutton);
1368 	main_display_bible(settings.MainWindowModule,
1369 			   settings.currentverse);
1370 }
1371 
1372 /******************************************************************************
1373  * Name
1374  *   on_checkbutton_xrefs_in_verse_list_toggled
1375  *
1376  * Synopsis
1377  *   #include "preferences_dialog.h"
1378  *   void on_checkbutton_xrefs_in_verse_list_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1379  *
1380  * Description
1381  *   En/disable use of verse list for Bible cross-refs.
1382  *
1383  * Return value
1384  *   void
1385  */
1386 
1387 void
on_checkbutton_xrefs_in_verse_list_toggled(GtkToggleButton * togglebutton,gpointer user_data)1388 on_checkbutton_xrefs_in_verse_list_toggled(GtkToggleButton *togglebutton,
1389 					   gpointer user_data)
1390 {
1391 	xml_set_value("Xiphos", "misc", "xrefsinverselist",
1392 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1393 	settings.xrefs_in_verse_list =
1394 	    gtk_toggle_button_get_active(togglebutton);
1395 }
1396 
1397 /******************************************************************************
1398  * Name
1399  *   on_checkbutton_prayerlist_toggled
1400  *
1401  * Synopsis
1402  *   #include "preferences_dialog.h"
1403  *   void on_checkbutton_prayerlist_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1404  *
1405  * Description
1406  *
1407  * Return value
1408  *   void
1409  */
1410 
1411 void
on_checkbutton_prayerlist_toggled(GtkToggleButton * togglebutton,gpointer user_data)1412 on_checkbutton_prayerlist_toggled(GtkToggleButton *togglebutton,
1413 				  gpointer user_data)
1414 {
1415 	xml_set_value("Xiphos", "misc", "prayerlist",
1416 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1417 	settings.prayerlist = gtk_toggle_button_get_active(togglebutton);
1418 
1419 	/* update module list to show choice */
1420 	if (settings.prayerlist)
1421 		gtk_widget_show(widgets.new_journal_item);
1422 	else
1423 		gtk_widget_hide(widgets.new_journal_item);
1424 	main_update_module_lists();
1425 	main_load_module_tree(sidebar.module_list);
1426 }
1427 
1428 /******************************************************************************
1429  * Name
1430  *   on_checkbutton_statusbar_toggled
1431  *
1432  * Synopsis
1433  *   #include "preferences_dialog.h"
1434  *   void on_checkbutton_statusbar_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1435  *
1436  * Description
1437  *
1438  * Return value
1439  *   void
1440  */
1441 
1442 void
on_checkbutton_statusbar_toggled(GtkToggleButton * togglebutton,gpointer user_data)1443 on_checkbutton_statusbar_toggled(GtkToggleButton *togglebutton, gpointer user_data)
1444 {
1445 	xml_set_value("Xiphos", "misc", "statusbar",
1446 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1447 	settings.statusbar = gtk_toggle_button_get_active(togglebutton);
1448 
1449 	if (settings.statusbar)
1450 		gtk_widget_show(widgets.appbar);
1451 	else
1452 		gtk_widget_hide(widgets.appbar);
1453 }
1454 
1455 /******************************************************************************
1456  * Name
1457  *   on_checkbutton_alternation_toggled
1458  *
1459  * Synopsis
1460  *   #include "preferences_dialog.h"
1461  *   void on_checkbutton_alternation_toggled(GtkToggleButton * togglebutton, gpointer user_data)
1462  *
1463  * Description
1464  *
1465  * Return value
1466  *   void
1467  */
1468 
1469 void
on_checkbutton_alternation_toggled(GtkToggleButton * togglebutton,gpointer user_data)1470 on_checkbutton_alternation_toggled(GtkToggleButton *togglebutton, gpointer user_data)
1471 {
1472 	xml_set_value("Xiphos", "misc", "alternation",
1473 		      (gtk_toggle_button_get_active(togglebutton) ? "1" : "0"));
1474 	settings.alternation = gtk_toggle_button_get_active(togglebutton);
1475 
1476 	main_update_parallel_page();	/* 1 verse */
1477 	if (settings.dockedInt) {	/* whole chapter */
1478 		main_update_parallel_page();
1479 	} else {
1480 		main_update_parallel_page_detached();
1481 	}
1482 }
1483 
1484 /******************************************************************************
1485  * Name
1486  *   on_folder_changed
1487  *
1488  * Synopsis
1489  *   #include "preferences_dialog.h"
1490  *   void on_folder_changed(GtkFileChooser * filechooser, gpointer user_data)
1491  *
1492  * Description
1493  *
1494  * Return value
1495  *   void
1496  */
1497 
on_folder_changed(GtkFileChooser * filechooser,gpointer user_data)1498 void on_folder_changed(GtkFileChooser *filechooser, gpointer user_data)
1499 {
1500 	gchar *directory =
1501 	    gtk_file_chooser_get_current_folder(filechooser);
1502 	xml_set_value("Xiphos", "studypad", "directory", directory);
1503 	settings.studypaddir = xml_get_value("studypad", "directory");
1504 	g_free(directory);
1505 }
1506 
1507 /******************************************************************************
1508  * Name
1509  *   on_combobox1_changed
1510  *
1511  * Synopsis
1512  *   #include "preferences_dialog.h"
1513  *   void on_combobox1_changed(GtkEditable * editable, gpointer user_data)
1514  *
1515  * Description
1516  *   combobox1 (verse number size)
1517  *   has changed - update Biblical text pane
1518  *
1519  * Return value
1520  *  void
1521  */
1522 
on_combobox1_changed(GtkComboBox * combobox,gpointer user_data)1523 void on_combobox1_changed(GtkComboBox *combobox, gpointer user_data)
1524 {
1525 	gchar *buf = NULL;
1526 	gchar *url = NULL;
1527 	GtkTreeIter iter;
1528 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1529 
1530 	gtk_combo_box_get_active_iter(combobox, &iter);
1531 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1532 	if (!buf)
1533 		return;
1534 	xml_set_value("Xiphos", "fontsize", "versenum", buf);
1535 	settings.verse_num_font_size_str =
1536 	    xml_get_value("fontsize", "versenum");
1537 	settings.verse_num_font_size =
1538 	    atoi(settings.verse_num_font_size_str);
1539 	url =
1540 	    g_strdup_printf("sword://%s/%s", settings.MainWindowModule,
1541 			    settings.currentverse);
1542 	main_url_handler(url, TRUE);
1543 	g_free(url);
1544 	g_free(buf);
1545 }
1546 
1547 /******************************************************************************
1548  * Name
1549  *   on_basecombobox1_changed
1550  *
1551  * Synopsis
1552  *   #include "preferences_dialog.h"
1553  *   void on_basecombobox1_changed(GtkEditable * editable, gpointer user_data)
1554  *
1555  * Description
1556  *   combobox1 (base font size)
1557  *   has changed - update Biblical text pane
1558  *
1559  * Return value
1560  *  void
1561  */
1562 
on_basecombobox1_changed(GtkComboBox * combobox,gpointer user_data)1563 void on_basecombobox1_changed(GtkComboBox *combobox, gpointer user_data)
1564 {
1565 	gchar *buf = NULL;
1566 	gchar *url = NULL;
1567 	GtkTreeIter iter;
1568 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1569 
1570 	gtk_combo_box_get_active_iter(combobox, &iter);
1571 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1572 	if (!buf)
1573 		return;
1574 	xml_set_value("Xiphos", "fontsize", "basefontsize", buf);
1575 	g_free(buf);
1576 
1577 	if (settings.base_font_size_str)
1578 		g_free(settings.base_font_size_str);
1579 	settings.base_font_size_str =
1580 	    xml_get_value("fontsize", "basefontsize");
1581 
1582 	settings.base_font_size = atoi(settings.base_font_size_str);
1583 	url = g_strdup_printf("sword://%s/%s",
1584 			      settings.MainWindowModule,
1585 			      settings.currentverse);
1586 	main_url_handler(url, TRUE);
1587 	g_free(url);
1588 	main_display_dictionary(settings.DictWindowModule,
1589 				settings.dictkey);
1590 }
1591 
1592 /******************************************************************************
1593  * Name
1594  *   on_combobox2_changed
1595  *
1596  * Synopsis
1597  *   #include "preferences_dialog.h"
1598  *   void on_combobox2_changed(GtkEditable * editable, gpointer user_data)
1599  *
1600  * Description
1601  *   combobox2 (Biblical text module) or combobox3 (Commentary module),
1602  *   has changed - update Biblical text and Commentary panes
1603  *
1604  * Return value
1605  *  void
1606  */
1607 
on_combobox2_changed(GtkComboBox * combobox,gpointer user_data)1608 void on_combobox2_changed(GtkComboBox *combobox, gpointer user_data)
1609 {
1610 	gchar *buf = NULL;
1611 	gchar *url = NULL;
1612 	GtkTreeIter iter;
1613 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1614 
1615 	gtk_combo_box_get_active_iter(combobox, &iter);
1616 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1617 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1618 		return;
1619 
1620 	url = g_strdup_printf("sword://%s/%s", buf, settings.currentverse);
1621 	main_url_handler(url, TRUE);
1622 	g_free(url);
1623 	g_free(buf);
1624 }
1625 
1626 /******************************************************************************
1627  * Name
1628  *   on_combobox4_changed
1629  *
1630  * Synopsis
1631  *   #include "preferences_dialog.h"
1632  *   void on_combobox4_changed(GtkEditable * editable, gpointer user_data)
1633  *
1634  * Description
1635  *   combobox4 (Dictionary module),
1636  *   has changed - update dictionary pane
1637  *
1638  * Return value
1639  *  void
1640  */
1641 
on_combobox4_changed(GtkComboBox * combobox,gpointer user_data)1642 void on_combobox4_changed(GtkComboBox *combobox, gpointer user_data)
1643 {
1644 	gchar *buf = NULL;
1645 	gchar *url = NULL;
1646 	GtkTreeIter iter;
1647 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1648 
1649 	gtk_combo_box_get_active_iter(combobox, &iter);
1650 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1651 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1652 		return;
1653 
1654 	url = g_strdup_printf("sword://%s/%s", buf, settings.dictkey);
1655 	main_url_handler(url, TRUE);
1656 	g_free(url);
1657 	g_free(buf);
1658 }
1659 
1660 /******************************************************************************
1661  * Name
1662  *   on_combobox5_changed
1663  *
1664  * Synopsis
1665  *   #include "preferences_dialog.h"
1666  *   void on_combobox5_changed(GtkEditable * editable, gpointer user_data)
1667  *
1668  * Description
1669  *   combobox5 (default dictionary module),
1670  *   has changed - update settings
1671  *
1672  * Return value
1673  *  void
1674  */
1675 
on_combobox5_changed(GtkComboBox * combobox,gpointer user_data)1676 void on_combobox5_changed(GtkComboBox *combobox, gpointer user_data)
1677 {
1678 	gchar *buf = NULL;
1679 	GtkTreeIter iter;
1680 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1681 
1682 	gtk_combo_box_get_active_iter(combobox, &iter);
1683 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1684 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1685 		return;
1686 	xml_set_value("Xiphos", "lexicons", "defaultdictionary", buf);
1687 	settings.DefaultDict =
1688 	    xml_get_value("lexicons", "defaultdictionary");
1689 	g_free(buf);
1690 }
1691 
1692 /******************************************************************************
1693  * Name
1694  *   on_combobox6_changed
1695  *
1696  * Synopsis
1697  *   #include "preferences_dialog.h"
1698  *   void on_combobox6_changed(GtkEditable * editable, gpointer user_data)
1699  *
1700  * Description
1701  *   combobox6 (Personal comments module),
1702  *   has changed - update settings
1703  *
1704  * Return value
1705  *  void
1706  */
1707 
on_combobox6_changed(GtkComboBox * combobox,gpointer user_data)1708 void on_combobox6_changed(GtkComboBox *combobox, gpointer user_data)
1709 {
1710 	gchar *buf = NULL;
1711 	GtkTreeIter iter;
1712 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1713 
1714 	gtk_combo_box_get_active_iter(combobox, &iter);
1715 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1716 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1717 		return;
1718 	xml_set_value("Xiphos", "modules", "percomm", buf);
1719 	settings.personalcommentsmod = xml_get_value("modules", "percomm");
1720 	g_free(buf);
1721 }
1722 
1723 /******************************************************************************
1724  * Name
1725  *   on_combobox12_changed
1726  *
1727  * Synopsis
1728  *   #include "preferences_dialog.h"
1729  *   void on_combobox12_changed(GtkEditable * editable, gpointer user_data)
1730  *
1731  * Description
1732  *   combobox12 (Daily Devotional module),
1733  *   has changed - update settings
1734  *
1735  * Return value
1736  *  void
1737  */
1738 
on_combobox12_changed(GtkComboBox * combobox,gpointer user_data)1739 void on_combobox12_changed(GtkComboBox *combobox, gpointer user_data)
1740 {
1741 	gchar *buf = NULL;
1742 	GtkTreeIter iter;
1743 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1744 
1745 	gtk_combo_box_get_active_iter(combobox, &iter);
1746 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1747 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1748 		return;
1749 	xml_set_value("Xiphos", "modules", "devotional", buf);
1750 	settings.devotionalmod = xml_get_value("modules", "devotional");
1751 	g_free(buf);
1752 }
1753 
1754 /******************************************************************************
1755  * Name
1756  *   on_combobox13_changed
1757  *
1758  * Synopsis
1759  *   #include "preferences_dialog.h"
1760  *   void on_combobox13_changed(GtkEditable * editable, gpointer user_data)
1761  *
1762  * Description
1763  *   combobox13 (Hebrew lex module),
1764  *   has changed - update settings
1765  *
1766  * Return value
1767  *  void
1768  */
1769 
on_combobox13_changed(GtkComboBox * combobox,gpointer user_data)1770 void on_combobox13_changed(GtkComboBox *combobox, gpointer user_data)
1771 {
1772 	gchar *buf = NULL;
1773 	GtkTreeIter iter;
1774 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1775 
1776 	gtk_combo_box_get_active_iter(combobox, &iter);
1777 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1778 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1779 		return;
1780 	xml_set_value("Xiphos", "lexicons", "hebrew", buf);
1781 	settings.lex_hebrew = xml_get_value("lexicons", "hebrew");
1782 	g_free(buf);
1783 }
1784 
1785 /******************************************************************************
1786  * Name
1787  *   on_combobox14_changed
1788  *
1789  * Synopsis
1790  *   #include "preferences_dialog.h"
1791  *   void on_combobox14_changed(GtkEditable * editable, gpointer user_data)
1792  *
1793  * Description
1794  *   combobox14 (Greek lex module),
1795  *   has changed - update settings
1796  *
1797  * Return value
1798  *  void
1799  */
1800 
on_combobox14_changed(GtkComboBox * combobox,gpointer user_data)1801 void on_combobox14_changed(GtkComboBox *combobox, gpointer user_data)
1802 {
1803 	gchar *buf = NULL;
1804 	GtkTreeIter iter;
1805 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1806 
1807 	gtk_combo_box_get_active_iter(combobox, &iter);
1808 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1809 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1810 		return;
1811 	xml_set_value("Xiphos", "lexicons", "greek", buf);
1812 	settings.lex_greek = xml_get_value("lexicons", "greek");
1813 	g_free(buf);
1814 }
1815 
1816 /******************************************************************************
1817  * Name
1818  *   on_combobox15_changed
1819  *
1820  * Synopsis
1821  *   #include "preferences_dialog.h"
1822  *   void on_combobox15_changed(GtkEditable * editable, gpointer user_data)
1823  *
1824  * Description
1825  *   combobox4 (Book module),
1826  *   has changed - update book pane
1827  *
1828  * Return value
1829  *  void
1830  */
1831 
on_combobox15_changed(GtkComboBox * combobox,gpointer user_data)1832 void on_combobox15_changed(GtkComboBox *combobox, gpointer user_data)
1833 {
1834 	gchar *buf = NULL;
1835 	gchar *url = NULL;
1836 	GtkTreeIter iter;
1837 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1838 
1839 	gtk_combo_box_get_active_iter(combobox, &iter);
1840 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1841 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1842 		return;
1843 	url = g_strdup_printf("sword://%s/%s", buf, "1");
1844 	main_url_handler(url, TRUE);
1845 	g_free(url);
1846 	g_free(buf);
1847 }
1848 
1849 /******************************************************************************
1850  * Name
1851  *   on_combobox16_changed
1852  *
1853  * Synopsis
1854  *   #include "preferences_dialog.h"
1855  *   void on_combobox16_changed(GtkEditable * editable, gpointer user_data)
1856  *
1857  * Description
1858  *   combobox16 (special locale),
1859  *   has changed - update settings
1860  *
1861  * Return value
1862  *  void
1863  */
1864 
on_combobox16_changed(GtkComboBox * combobox,gpointer user_data)1865 void on_combobox16_changed(GtkComboBox *combobox, gpointer user_data)
1866 {
1867 	gchar *buf = NULL;
1868 	GtkTreeIter iter;
1869 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1870 	gboolean clear, set;
1871 
1872 	gtk_combo_box_get_active_iter(combobox, &iter);
1873 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1874 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1875 		return;
1876 
1877 	clear = !strcmp(buf, NONE);
1878 	if (!clear) {
1879 		/* something new was chosen:
1880 		   move forward to and isolate "(xx_YY)" locale spec. */
1881 		buf = strrchr(buf, '(') + 1;
1882 		*strchr(buf, ')') = '\0';
1883 	}
1884 
1885 	set = ((!settings.special_locale && strcmp(buf, NONE)) ||
1886 	       (settings.special_locale && (strcmp(settings.special_locale, buf))));
1887 	if (clear || set)
1888 		gui_generic_warning(_("Locale will take effect after restart."));
1889 
1890 	if (clear)
1891 		*buf = '\0';
1892 
1893 	/* NOTE: These 2 uses of "None" are NOT TRANSLATABLE. */
1894 	xml_set_value("Xiphos", "locale", "special",
1895 		      (clear ? "None" : buf));
1896 	g_free(settings.special_locale); /* dispose of old content */
1897 	settings.special_locale =
1898 	    (clear ? g_strdup("None") : g_strdup(buf));
1899 }
1900 
1901 /******************************************************************************
1902  * Name
1903  *   on_combobox17_changed
1904  *
1905  * Synopsis
1906  *   #include "preferences_dialog.h"
1907  *   void on_combobox17_changed(GtkEditable * editable, gpointer user_data)
1908  *
1909  * Description
1910  *   combobox17 (language font preferences) => make a font selection.
1911  *
1912  * Return value
1913  *  void
1914  */
1915 
on_combobox17_changed(GtkComboBox * combobox,gpointer user_data)1916 void on_combobox17_changed(GtkComboBox *combobox, gpointer user_data)
1917 {
1918 	gchar *buf = NULL;
1919 	GtkTreeIter iter;
1920 	GtkTreeModel *model = gtk_combo_box_get_model(combobox);
1921 	gchar *mod_name;
1922 
1923 	gtk_combo_box_get_active_iter(combobox, &iter);
1924 	gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &buf, -1);
1925 	if (!buf || !strcmp(buf, _("-- Select --"))) /* see fill_combobox */
1926 		return;
1927 
1928 	buf = strrchr(buf, '(') + 1;
1929 	*strchr(buf, ')') = '\0';
1930 
1931 	mod_name = g_strdup_printf("Language:%s", buf);
1932 	gui_set_module_font(mod_name);
1933 	redisplay_to_realign();
1934 	g_free(mod_name);
1935 }
1936 
1937 /******************************************************************************
1938  * Name
1939  *   add_columns
1940  *
1941  * Synopsis
1942  *   #include "preferences_dialog.h"
1943  *   void add_columns(GtkWidget * listview)
1944  *
1945  * Description
1946  *
1947  * Return value
1948  *   void
1949  */
1950 
add_columns(GtkWidget * treeview)1951 static void add_columns(GtkWidget *treeview)
1952 {
1953 	GtkCellRenderer *renderer;
1954 	GtkTreeViewColumn *column;
1955 
1956 	renderer = gtk_cell_renderer_text_new();
1957 	column =
1958 	    gtk_tree_view_column_new_with_attributes(_("Preferences"),
1959 						     renderer,
1960 						     "text", 0, NULL);
1961 
1962 	gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
1963 }
1964 
1965 /******************************************************************************
1966  * Name
1967  *   tree_selection_changed
1968  *
1969  * Synopsis
1970  *   #include "gui/.h"
1971  *   void tree_selection_changed(GtkTreeSelection * selection,
1972  *		      GtkWidget * tree_widget)
1973  *
1974  * Description
1975  *
1976  * Return value
1977  *   void
1978  */
1979 
1980 static void
tree_selection_changed(GtkTreeSelection * selection,gpointer data)1981 tree_selection_changed(GtkTreeSelection *selection, gpointer data)
1982 {
1983 	GtkTreeIter selected;
1984 	gint page;
1985 	GtkTreeModel *model;
1986 
1987 	if (!gtk_tree_selection_get_selected(selection, &model, &selected))
1988 		return;
1989 
1990 	gtk_tree_model_get(model, &selected, 1, &page, -1);
1991 	gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page);
1992 }
1993 
1994 /******************************************************************************
1995  * Name
1996  *   on_dialog_prefs_response
1997  *
1998  * Synopsis
1999  *   #include "gui/.h"
2000  *   void on_dialog_prefs_response(GtkDialog * dialog, gint response_id,
2001  *					gpointer user_data)
2002  *
2003  * Description
2004  *
2005  * Return value
2006  *   void
2007  */
2008 
2009 void
on_dialog_prefs_response(GtkDialog * dialog,gint response_id,gpointer user_data)2010 on_dialog_prefs_response(GtkDialog *dialog,
2011 			 gint response_id, gpointer user_data)
2012 {
2013 	if (response_id == GTK_RESPONSE_CLOSE) {
2014 		settings.display_prefs = 0;
2015 		xml_set_value("Xiphos", "layout", "prefsopen", "0");
2016 
2017 		xml_save_settings_doc(settings.fnconfigure);
2018 		gtk_widget_destroy(GTK_WIDGET(dialog));
2019 
2020 		dialog_prefs = NULL;
2021 		speaker_window = NULL;
2022 		speaker_list = NULL;
2023 	}
2024 	main_update_parallel_page();
2025 }
2026 
create_model(void)2027 static GtkTreeModel *create_model(void)
2028 {
2029 	GtkTreeStore *model;
2030 	GtkTreeIter iter;
2031 	GtkTreeIter child_iter;
2032 
2033 	model = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
2034 
2035 	gtk_tree_store_append(model, &iter, NULL);
2036 	gtk_tree_store_set(model, &iter, 0, _("General"), -1);
2037 
2038 	gtk_tree_store_append(model, &child_iter, &iter);
2039 	gtk_tree_store_set(model, &child_iter, 0, _("Options"), 1, 4, -1);
2040 
2041 	gtk_tree_store_append(model, &child_iter, &iter);
2042 	gtk_tree_store_set(model, &child_iter, 0, _("BibleSync"), 1, 3,
2043 			   -1);
2044 
2045 	gtk_tree_store_append(model, &iter, NULL);
2046 	gtk_tree_store_set(model, &iter, 0, _("Fonts"), -1);
2047 
2048 	gtk_tree_store_append(model, &child_iter, &iter);
2049 	gtk_tree_store_set(model, &child_iter, 0, _("Color"), 1, 1, -1);
2050 
2051 	gtk_tree_store_append(model, &child_iter, &iter);
2052 	gtk_tree_store_set(model, &child_iter, 0, _("Sizes and Faces"), 1,
2053 			   2, -1);
2054 
2055 	gtk_tree_store_append(model, &iter, NULL);
2056 	gtk_tree_store_set(model, &iter, 0, _("Modules"), -1);
2057 
2058 	/* the former element "5" was previously here,
2059 	   which was for the "main modules," now defunct.
2060 	   we maintain the numbering because 6 & 7 are fixed refs. */
2061 
2062 	gtk_tree_store_append(model, &child_iter, &iter);
2063 	gtk_tree_store_set(model, &child_iter, 0, _("Parallel"), 1, 6, -1);
2064 
2065 	gtk_tree_store_append(model, &child_iter, &iter);
2066 	gtk_tree_store_set(model, &child_iter, 0, _("Special"), 1, 7, -1);
2067 
2068 	return GTK_TREE_MODEL(model);
2069 }
2070 
2071 /******************************************************************************
2072  * Name
2073  *   setup_color_pickers
2074  *
2075  * Synopsis
2076  *   #include "preferences_dialog.h"
2077  *   void setup_color_pickers(void)
2078  *
2079  * Description
2080  *
2081  * Return value
2082  *   void
2083  */
2084 
setup_color_pickers(void)2085 void setup_color_pickers(void)
2086 {
2087 #if GTK_CHECK_VERSION(3, 4, 0)
2088 	GdkRGBA rgba;
2089 	if (gdk_rgba_parse(&rgba, settings.bible_bg_color))
2090 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2091 					   color_picker.text_background,
2092 					   &rgba);
2093 	if (gdk_rgba_parse(&rgba, settings.bible_text_color))
2094 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2095 					   color_picker.text,
2096 					   &rgba);
2097 	if (gdk_rgba_parse(&rgba, settings.currentverse_color))
2098 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2099 					   color_picker.text_current_verse,
2100 					   &rgba);
2101 	if (gdk_rgba_parse(&rgba, settings.bible_verse_num_color))
2102 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2103 					   color_picker.verse_numbers,
2104 					   &rgba);
2105 	if (gdk_rgba_parse(&rgba, settings.link_color))
2106 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2107 					   color_picker.href_links,
2108 					   &rgba);
2109 	if (gdk_rgba_parse(&rgba, settings.highlight_fg))
2110 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2111 					   color_picker.highlight_fg,
2112 					   &rgba);
2113 	if (gdk_rgba_parse(&rgba, settings.highlight_bg))
2114 		gtk_color_chooser_set_rgba((GtkColorChooser *)
2115 					   color_picker.highlight_bg,
2116 					   &rgba);
2117 #else
2118 	GdkColor color;
2119 	if (string_is_color(settings.bible_bg_color)) {
2120 		gdk_color_parse(settings.bible_bg_color, &color);
2121 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.text_background),
2122 					   &color);
2123 	} else {
2124 		gdk_color_parse("#FFFFFF", &color);
2125 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.text_background),
2126 					   &color);
2127 	}
2128 	if (string_is_color(settings.bible_text_color)) {
2129 		gdk_color_parse(settings.bible_text_color, &color);
2130 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.text), &color);
2131 	} else {
2132 		gdk_color_parse("#000000", &color);
2133 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.text), &color);
2134 	}
2135 
2136 	if (string_is_color(settings.currentverse_color)) {
2137 		gdk_color_parse(settings.currentverse_color, &color);
2138 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.text_current_verse), &color);
2139 	} else {
2140 		gdk_color_parse("#339766", &color);
2141 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.text_current_verse), &color);
2142 	}
2143 
2144 	if (string_is_color(settings.bible_verse_num_color)) {
2145 		gdk_color_parse(settings.bible_verse_num_color, &color);
2146 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.verse_numbers),
2147 					   &color);
2148 	} else {
2149 		gdk_color_parse("#0000CF", &color);
2150 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.verse_numbers),
2151 					   &color);
2152 	}
2153 
2154 	if (string_is_color(settings.link_color)) {
2155 		gdk_color_parse(settings.link_color, &color);
2156 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.href_links),
2157 					   &color);
2158 	} else {
2159 		gdk_color_parse("#878787", &color);
2160 		gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.href_links),
2161 					   &color);
2162 	}
2163 
2164 	// contrasty highlighting -- foreground.
2165 	if (string_is_color(settings.highlight_fg))
2166 		gdk_color_parse(settings.highlight_fg, &color);
2167 	else
2168 		gdk_color_parse("#FFFF00", &color);
2169 	gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.highlight_fg), &color);
2170 
2171 	// contrasty highlighting -- background.
2172 	if (string_is_color(settings.highlight_bg))
2173 		gdk_color_parse(settings.highlight_bg, &color);
2174 	else
2175 		gdk_color_parse("#060680", &color);
2176 	gtk_color_button_set_color(GTK_COLOR_BUTTON(color_picker.highlight_bg), &color);
2177 #endif
2178 }
2179 
setup_check_buttons(void)2180 static void setup_check_buttons(void)
2181 {
2182 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.use_default_dictionary),
2183 				     settings.useDefaultDict);
2184 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.show_devotion),
2185 				     settings.showdevotional);
2186 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.show_splash_screen),
2187 				     settings.showsplash);
2188 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.use_chapter_scroll),
2189 				     settings.chapter_scroll);
2190 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.use_imageresize),
2191 				     settings.imageresize);
2192 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.use_verse_num_bold),
2193 				     settings.verse_num_bold);
2194 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.use_verse_num_bracket),
2195 				     settings.verse_num_bracket);
2196 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.use_verse_num_superscript),
2197 				     settings.verse_num_superscript);
2198 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.versehighlight),
2199 				     settings.versehighlight);
2200 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.annotate_highlight),
2201 				     settings.annotate_highlight);
2202 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.xrefs_in_verse_list),
2203 				     settings.xrefs_in_verse_list);
2204 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.prayerlist),
2205 				     settings.prayerlist);
2206 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.statusbar),
2207 				     settings.statusbar);
2208 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.alternation),
2209 				     settings.alternation);
2210 
2211 	/* v-- BibleSync --v */
2212 	/* toggles */
2213 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.bs_debug),
2214 				     settings.bs_debug);
2215 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.bs_presence),
2216 				     settings.bs_presence);
2217 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.bs_mismatch),
2218 				     settings.bs_mismatch);
2219 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.bs_group_tab),
2220 				     settings.bs_group_tab);
2221 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.bs_keyboard),
2222 				     settings.bs_keyboard);
2223 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button.bs_privacy),
2224 				     settings.bs_privacy);
2225 	gtk_widget_set_sensitive(check_button.bs_privacy,
2226 				 biblesync_personal());
2227 	gtk_widget_set_sensitive(check_button.bs_keyboard,
2228 				 ((settings.bs_mode == 1) || (settings.bs_mode == 2)));
2229 
2230 	/* mode */
2231 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_off),
2232 				     (settings.bs_mode == 0));
2233 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_personal),
2234 				     (settings.bs_mode == 1));
2235 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_speaker),
2236 				     (settings.bs_mode == 2));
2237 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_mode_audience),
2238 				     (settings.bs_mode == 3));
2239 
2240 	/* navigation method */
2241 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_nav_direct),
2242 				     (settings.bs_navdirect == 1));
2243 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_nav_verselist),
2244 				     (settings.bs_navdirect == 0));
2245 
2246 	/* listening choice */
2247 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_listen_some),
2248 				     (settings.bs_listen_set == 0));
2249 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_listen_all),
2250 				     (settings.bs_listen_set == 1));
2251 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button.bs_listen_none),
2252 				     (settings.bs_listen_set == 2));
2253 	/* ^-- BibleSync --^ */
2254 
2255 	g_signal_connect(check_button.use_default_dictionary, "toggled",
2256 			 G_CALLBACK(on_checkbutton6_toggled), NULL);
2257 	g_signal_connect(check_button.show_devotion, "toggled",
2258 			 G_CALLBACK(on_checkbutton7_toggled), NULL);
2259 	g_signal_connect(check_button.show_splash_screen, "toggled",
2260 			 G_CALLBACK(on_checkbutton8_toggled), NULL);
2261 	g_signal_connect(check_button.use_chapter_scroll, "toggled",
2262 			 G_CALLBACK(on_checkbutton_scroll_toggled), NULL);
2263 	g_signal_connect(check_button.use_imageresize, "toggled",
2264 			 G_CALLBACK(on_checkbutton_imageresize_toggled),
2265 			 NULL);
2266 	g_signal_connect(check_button.use_verse_num_bold, "toggled",
2267 			 G_CALLBACK(on_checkbutton_verse_num_bold_toggled),
2268 			 NULL);
2269 	g_signal_connect(check_button.use_verse_num_bracket, "toggled",
2270 			 G_CALLBACK(on_checkbutton_verse_num_bracket_toggled), NULL);
2271 	g_signal_connect(check_button.use_verse_num_superscript, "toggled",
2272 			 G_CALLBACK(on_checkbutton_verse_num_superscript_toggled),
2273 			 NULL);
2274 	g_signal_connect(check_button.versehighlight, "toggled",
2275 			 G_CALLBACK(on_checkbutton_versehighlight_toggled),
2276 			 NULL);
2277 	g_signal_connect(check_button.annotate_highlight, "toggled",
2278 			 G_CALLBACK(on_checkbutton_annotate_highlight_toggled),
2279 			 NULL);
2280 	g_signal_connect(check_button.xrefs_in_verse_list, "toggled",
2281 			 G_CALLBACK(on_checkbutton_xrefs_in_verse_list_toggled),
2282 			 NULL);
2283 	g_signal_connect(check_button.prayerlist, "toggled",
2284 			 G_CALLBACK(on_checkbutton_prayerlist_toggled),
2285 			 NULL);
2286 	g_signal_connect(check_button.statusbar, "toggled",
2287 			 G_CALLBACK(on_checkbutton_statusbar_toggled),
2288 			 NULL);
2289 	g_signal_connect(check_button.alternation, "toggled",
2290 			 G_CALLBACK(on_checkbutton_alternation_toggled),
2291 			 NULL);
2292 
2293 	/* v-- BibleSync --v */
2294 	g_signal_connect(check_button.bs_debug, "toggled",
2295 			 G_CALLBACK(on_checkbutton_biblesync_toggled),
2296 			 &settings.bs_debug);
2297 	g_signal_connect(check_button.bs_presence, "toggled",
2298 			 G_CALLBACK(on_checkbutton_biblesync_toggled),
2299 			 &settings.bs_presence);
2300 	g_signal_connect(check_button.bs_mismatch, "toggled",
2301 			 G_CALLBACK(on_checkbutton_biblesync_toggled),
2302 			 &settings.bs_mismatch);
2303 	g_signal_connect(check_button.bs_group_tab, "toggled",
2304 			 G_CALLBACK(on_checkbutton_biblesync_toggled),
2305 			 &settings.bs_group_tab);
2306 	g_signal_connect(check_button.bs_keyboard, "toggled",
2307 			 G_CALLBACK(on_checkbutton_biblesync_toggled),
2308 			 &settings.bs_keyboard);
2309 	g_signal_connect(check_button.bs_privacy, "toggled",
2310 			 G_CALLBACK(on_checkbutton_biblesync_toggled),
2311 			 &settings.bs_privacy);
2312 
2313 	g_signal_connect(radio_button.bs_mode_off, "toggled",
2314 			 G_CALLBACK(on_radiobutton_biblesync_mode),
2315 			 &rb_cb[0]);
2316 	g_signal_connect(radio_button.bs_mode_personal, "toggled",
2317 			 G_CALLBACK(on_radiobutton_biblesync_mode),
2318 			 &rb_cb[1]);
2319 	g_signal_connect(radio_button.bs_mode_speaker, "toggled",
2320 			 G_CALLBACK(on_radiobutton_biblesync_mode),
2321 			 &rb_cb[2]);
2322 	g_signal_connect(radio_button.bs_mode_audience, "toggled",
2323 			 G_CALLBACK(on_radiobutton_biblesync_mode),
2324 			 &rb_cb[3]);
2325 
2326 	g_signal_connect(radio_button.bs_nav_direct, "toggled",
2327 			 G_CALLBACK(on_radiobutton_biblesync_nav),
2328 			 &rb_cb[1]);
2329 	g_signal_connect(radio_button.bs_nav_verselist, "toggled",
2330 			 G_CALLBACK(on_radiobutton_biblesync_nav),
2331 			 &rb_cb[0]);
2332 
2333 	g_signal_connect(radio_button.bs_listen_some, "toggled",
2334 			 G_CALLBACK(on_radiobutton_biblesync_listen),
2335 			 &rb_cb[0]);
2336 	g_signal_connect(radio_button.bs_listen_all, "toggled",
2337 			 G_CALLBACK(on_radiobutton_biblesync_listen),
2338 			 &rb_cb[1]);
2339 	g_signal_connect(radio_button.bs_listen_none, "toggled",
2340 			 G_CALLBACK(on_radiobutton_biblesync_listen),
2341 			 &rb_cb[2]);
2342 	/* ^-- BibleSync --^ */
2343 }
2344 
2345 /*
2346  * comparator function to determine filling of true general dict lists.
2347  */
dict_no_image_map_dd(char * modname,char * feature)2348 static gboolean dict_no_image_map_dd(char *modname, char *feature)
2349 {
2350 	/* no features or categories */
2351 	const char *f = main_get_mod_config_entry(modname, "Feature");
2352 	const char *c = main_get_mod_config_entry(modname, "Category");
2353 	return ((c == NULL) && (f == NULL));
2354 }
2355 
2356 /*
2357  * comparator function to determine filling of heb/grk dict lists.
2358  */
dict_match_feature(char * modname,char * feature)2359 static gboolean dict_match_feature(char *modname, char *feature)
2360 {
2361 	const char *f = main_get_mod_config_entry(modname, "Feature");
2362 	return (f && (!strcmp(f, feature)));
2363 }
2364 
fill_combobox(GList * glist,GtkComboBox * combo,gchar * current_item,gboolean (* eval)(char *,char *),char * feature)2365 static void fill_combobox(GList *glist, GtkComboBox *combo, gchar *current_item, gboolean (*eval)(char *, char *), /* evaluator of feature */
2366 			  char *feature)
2367 { /* feature sought or avoided */
2368 	GtkTreeIter iter;
2369 	GtkListStore *store;
2370 	GtkCellRenderer *renderer;
2371 	gint index = 0;
2372 	gint i = 0;
2373 
2374 	store = gtk_list_store_new(1, G_TYPE_STRING);
2375 	gtk_combo_box_set_model(combo, GTK_TREE_MODEL(store));
2376 
2377 	renderer = gtk_cell_renderer_text_new();
2378 	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
2379 	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", 0, NULL);
2380 
2381 	gtk_list_store_clear(GTK_LIST_STORE(store));
2382 
2383 	gtk_list_store_append(GTK_LIST_STORE(store), &iter);
2384 	gtk_list_store_set(GTK_LIST_STORE(store),
2385 			   &iter, 0, _("-- Select --"), -1);
2386 
2387 	while (glist) {
2388 		if ((eval == NULL) || (*eval)(glist->data, feature)) {
2389 			/* "anything goes" or "acceptable match" */
2390 			gtk_list_store_append(GTK_LIST_STORE(store),
2391 					      &iter);
2392 			gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0,
2393 					   (gchar *)glist->data, -1);
2394 			if (current_item && !strcmp((gchar *)glist->data, current_item))
2395 				index = i + 1;
2396 			++i;
2397 		}
2398 		glist = g_list_next(glist);
2399 	}
2400 	gtk_combo_box_set_active(combo, index);
2401 }
2402 
get_font_size_index(const char * font)2403 static gint get_font_size_index(const char *font)
2404 {
2405 	if (!strcmp(font, "-2"))
2406 		return 0;
2407 	if (!strcmp(font, "-1"))
2408 		return 1;
2409 	if (!strcmp(font, "+0"))
2410 		return 2;
2411 	if (!strcmp(font, "+1"))
2412 		return 3;
2413 	if (!strcmp(font, "+2"))
2414 		return 4;
2415 	if (!strcmp(font, "+3"))
2416 		return 5;
2417 	if (!strcmp(font, "+4"))
2418 		return 6;
2419 	if (!strcmp(font, "+5"))
2420 		return 7;
2421 	return 0;
2422 }
2423 
setup_module_comboboxes(void)2424 static void setup_module_comboboxes(void)
2425 {
2426 	/*
2427 	 * Miscellaneous Modules page
2428 	 */
2429 	fill_combobox(get_list(DEVOTION_LIST),
2430 		      GTK_COMBO_BOX(combo.devotion_module),
2431 		      settings.devotionalmod, NULL, NULL);
2432 	fill_combobox(get_list(DICT_LIST),
2433 		      GTK_COMBO_BOX(combo.hebrew_lex__module),
2434 		      settings.lex_hebrew, dict_match_feature,
2435 		      "HebrewDef");
2436 	fill_combobox(get_list(DICT_LIST),
2437 		      GTK_COMBO_BOX(combo.greek_lex__module),
2438 		      settings.lex_greek, dict_match_feature, "GreekDef");
2439 	fill_combobox(get_list(DICT_LIST),
2440 		      GTK_COMBO_BOX(combo.default_dictionary_module),
2441 		      settings.DefaultDict, dict_no_image_map_dd, NULL);
2442 	fill_combobox(get_list(PERCOMM_LIST),
2443 		      GTK_COMBO_BOX(combo.percomm_module),
2444 		      settings.personalcommentsmod, NULL, NULL);
2445 
2446 	/*
2447 	 * signal connectivity
2448 	 */
2449 	g_signal_connect(combo.devotion_module, "changed",
2450 			 G_CALLBACK(on_combobox12_changed), NULL);
2451 	g_signal_connect(combo.hebrew_lex__module, "changed",
2452 			 G_CALLBACK(on_combobox13_changed), NULL);
2453 	g_signal_connect(combo.greek_lex__module, "changed",
2454 			 G_CALLBACK(on_combobox14_changed), NULL);
2455 	g_signal_connect(combo.default_dictionary_module, "changed",
2456 			 G_CALLBACK(on_combobox5_changed), NULL);
2457 	g_signal_connect(combo.percomm_module, "changed",
2458 			 G_CALLBACK(on_combobox6_changed), NULL);
2459 }
2460 
setup_locale_combobox(void)2461 void setup_locale_combobox(void)
2462 {
2463 	char **locale, brief_locale[3], *real_locale, *current_locale =
2464 							  NULL;
2465 	GList *chase, *list = g_list_append(NULL, g_strdup(NONE));
2466 
2467 	brief_locale[2] = '\0';
2468 	for (locale = &locale_set[0]; *locale; ++locale) {
2469 		brief_locale[0] = (*locale)[0];
2470 		brief_locale[1] = (*locale)[1];
2471 		real_locale = g_strdup_printf("%s (%s)",
2472 					      main_get_language_map(brief_locale), *locale);
2473 		list = g_list_append(list, real_locale);
2474 		if (settings.special_locale &&
2475 		    !strcmp(settings.special_locale, *locale))
2476 			current_locale = real_locale;
2477 	}
2478 	fill_combobox(list, GTK_COMBO_BOX(combo.special_locale),
2479 		      (current_locale ? current_locale : NONE),
2480 		      NULL, NULL);
2481 	for (chase = list; chase; chase = g_list_next(chase))
2482 		g_free(chase->data);
2483 	g_list_free(list);
2484 
2485 	g_signal_connect(combo.special_locale, "changed",
2486 			 G_CALLBACK(on_combobox16_changed), NULL);
2487 }
2488 
setup_font_prefs_combobox(void)2489 void setup_font_prefs_combobox(void)
2490 {
2491 	char **language_list = main_get_module_language_list();
2492 	char **language;
2493 	GList *chase, *list = NULL;
2494 
2495 	for (language = &language_list[0]; *language; ++language) {
2496 		char *real_language =
2497 			g_strdup_printf("%s (%s)",
2498 					main_get_language_map(*language), *language);
2499 		list = g_list_append(list, real_language);
2500 	}
2501 	fill_combobox(list, GTK_COMBO_BOX(combo.font_prefs),
2502 		      NULL, NULL, NULL);
2503 	for (chase = list; chase; chase = g_list_next(chase))
2504 		g_free(chase->data);
2505 	g_list_free(list);
2506 	g_strfreev(language_list);
2507 
2508 	g_signal_connect(combo.font_prefs, "changed",
2509 			 G_CALLBACK(on_combobox17_changed), NULL);
2510 }
2511 
2512 /******************************************************************************
2513  * Name
2514  *   button_release_event
2515  *
2516  * Synopsis
2517  *   #include "gui/search_dialog.h"
2518  *   static gboolean button_release_event(GtkWidget * widget,
2519  *					  GdkEventButton * event,
2520  *					  gpointer data)
2521  *
2522  * Description
2523  *   click on treeview folder to expand or collapse it
2524  *
2525  * Return value
2526  *   gboolean
2527  */
2528 
button_release_event(GtkWidget * widget,GdkEventButton * event,gpointer data)2529 static gboolean button_release_event(GtkWidget *widget,
2530 				     GdkEventButton *event, gpointer data)
2531 {
2532 	GtkTreeSelection *selection = NULL;
2533 	GtkTreeIter selected;
2534 	GtkTreeModel *model;
2535 	GtkTreePath *path;
2536 
2537 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
2538 	if ((!gtk_tree_selection_get_selected(selection, &model, &selected)) || (!gtk_tree_model_iter_has_child(model, &selected)))
2539 		return FALSE;
2540 
2541 	path = gtk_tree_model_get_path(model, &selected);
2542 	if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path))
2543 		gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path);
2544 	else
2545 		gtk_tree_view_expand_row(GTK_TREE_VIEW(widget), path,
2546 					 FALSE);
2547 	gtk_tree_path_free(path);
2548 	return FALSE;
2549 }
2550 
2551 /******************************************************************************
2552  * Name
2553  *
2554  *
2555  * Synopsis
2556  *   #include "gui/search_dialog.h"
2557  *   static void _setup_listview
2558  *
2559  * Description
2560  *   init the listing of currently-set parallel modules.
2561  *
2562  * Return value
2563  *
2564  */
2565 
ps_setup_listview()2566 static void ps_setup_listview()
2567 {
2568 	GtkListStore *model;
2569 	GtkTreeViewColumn *column;
2570 	GtkTreeIter iter;
2571 	GtkTreeModel *model_t;
2572 	GtkListStore *list_store;
2573 	int i;
2574 
2575 	model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
2576 	gtk_tree_view_set_model(GTK_TREE_VIEW(parallel_select.listview),
2577 				GTK_TREE_MODEL(model));
2578 
2579 	for (i = 0; i < 2; ++i) {
2580 		GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
2581 		column = gtk_tree_view_column_new_with_attributes("Module",
2582 								  renderer,
2583 								  "text",
2584 								  i, NULL);
2585 		gtk_tree_view_append_column(GTK_TREE_VIEW(parallel_select.listview),
2586 					    column);
2587 	}
2588 	gtk_tree_view_column_set_sort_column_id(column, 0);
2589 
2590 	model_t =
2591 	    gtk_tree_view_get_model(GTK_TREE_VIEW(parallel_select.listview));
2592 	list_store = GTK_LIST_STORE(model_t);
2593 	gtk_list_store_clear(list_store);
2594 
2595 	if (settings.parallel_list) {
2596 		for (i = 0; settings.parallel_list[i]; ++i) {
2597 			const char *abbreviation =
2598 			    main_get_abbreviation(settings.parallel_list
2599 						      [i]);
2600 			gtk_list_store_append(list_store, &iter);
2601 			gtk_list_store_set(list_store, &iter,
2602 					   0, main_get_module_description(settings.parallel_list[i]),
2603 					   1,
2604 					   (abbreviation
2605 						? abbreviation
2606 						: (gchar *)
2607 						  settings.parallel_list[i]),
2608 					   -1);
2609 		}
2610 	}
2611 }
2612 
2613 /******************************************************************************
2614  * Name
2615  *   modules_lists_changed
2616  *
2617  * Synopsis
2618  *   #include "gui/search_dialog.h"
2619  *   void modules_lists_changed(GtkTreeSelection * selection,
2620  *		     					 gpointer data)
2621  *
2622  * Description
2623  *
2624  * Return value
2625  *   void
2626  */
2627 
2628 static gchar *module_selected = NULL;
2629 
modules_lists_changed(GtkTreeSelection * selection,GtkTreeView * tree_widget)2630 static void modules_lists_changed(GtkTreeSelection *selection,
2631 				  GtkTreeView *tree_widget)
2632 {
2633 	gchar *mod = NULL;
2634 	GtkTreeIter selected;
2635 	GtkTreeModel *model =
2636 	    gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget));
2637 
2638 	if (!gtk_tree_selection_get_selected(selection, NULL, &selected))
2639 		return;
2640 	if (gtk_tree_model_iter_has_child(model, &selected)) {
2641 		g_free(module_selected);
2642 		module_selected = NULL;
2643 		return;
2644 	}
2645 
2646 	gtk_tree_model_get(model, &selected, UTIL_COL_MODULE, &mod, -1);
2647 	if (mod) {
2648 		g_free(module_selected);
2649 		module_selected = mod;
2650 	}
2651 }
2652 
2653 /******************************************************************************
2654  * Name
2655  *
2656  *
2657  * Synopsis
2658  *   #include "gui/search_dialog.h"
2659  *   void ps_setup_treeview(GtkWidget * treeview)
2660  *
2661  * Description
2662  *
2663  *
2664  * Return value
2665  *
2666  */
2667 
ps_setup_treeview(GtkWidget * treeview)2668 static void ps_setup_treeview(GtkWidget *treeview)
2669 {
2670 	GtkCellRenderer *renderer;
2671 	GtkTreeViewColumn *column;
2672 	GObject *selection;
2673 
2674 	renderer = gtk_cell_renderer_text_new();
2675 	column = gtk_tree_view_column_new_with_attributes("Found",
2676 							  renderer,
2677 							  "text", 0, NULL);
2678 	gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
2679 	gtk_tree_view_column_set_sort_column_id(column, 0);
2680 	gui_load_module_tree(treeview, TRUE);
2681 
2682 	selection =
2683 	    G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)));
2684 	g_signal_connect_after(G_OBJECT(treeview), "button_release_event",
2685 			       G_CALLBACK(button_release_event),
2686 			       GINT_TO_POINTER(0));
2687 	g_signal_connect(selection, "changed",
2688 			 G_CALLBACK(modules_lists_changed), treeview);
2689 }
2690 
on_mod_sel_add_clicked(GtkWidget * button,gchar * user_data)2691 static void on_mod_sel_add_clicked(GtkWidget *button, gchar *user_data)
2692 {
2693 	GtkTreeModel *model;
2694 	GtkListStore *list_store;
2695 	GtkTreeIter iter;
2696 	char *parallels = g_strdup(""), *newhold;
2697 	const char *abbreviation;
2698 	int count;
2699 
2700 	if (!module_selected) {
2701 		g_free(parallels);
2702 		return;
2703 	}
2704 	abbreviation = main_get_abbreviation(module_selected);
2705 
2706 	model =
2707 	    gtk_tree_view_get_model(GTK_TREE_VIEW(parallel_select.listview));
2708 	list_store = GTK_LIST_STORE(model);
2709 
2710 	gtk_list_store_append(list_store, &iter);
2711 	gtk_list_store_set(list_store, &iter,
2712 			   0, main_get_module_description(module_selected),
2713 			   1,
2714 			   (abbreviation ? abbreviation : module_selected),
2715 			   -1);
2716 
2717 	if (settings.parallel_list == NULL) {
2718 		settings.parallel_list =
2719 		    g_strsplit(module_selected, ",", -1);
2720 	} else {
2721 		for (count = 0; settings.parallel_list[count]; ++count)
2722 			; /* count up the set */
2723 		settings.parallel_list =
2724 		    g_renew(gchar *, settings.parallel_list, count + 2);
2725 		settings.parallel_list[count] = g_strdup(module_selected); /* new element */
2726 		settings.parallel_list[count + 1] = NULL;
2727 	}
2728 
2729 	for (count = 0; settings.parallel_list[count]; ++count) {
2730 		newhold =
2731 		    g_strconcat(parallels, settings.parallel_list[count],
2732 				",", NULL);
2733 		g_free(parallels);
2734 		parallels = newhold;
2735 	}
2736 
2737 	if (*parallels) {
2738 		*(parallels + strlen(parallels) - 1) = '\0'; /* end comma */
2739 		xml_set_value("Xiphos", "modules", "parallels", parallels);
2740 	}
2741 	g_free(parallels);
2742 }
2743 
on_mod_sel_close_clicked(void)2744 static void on_mod_sel_close_clicked(void)
2745 {
2746 	gtk_widget_destroy(GTK_WIDGET(parallel_select.mod_sel_dialog));
2747 }
2748 
2749 /******************************************************************************
2750  * Name
2751  *   ps_button_clear
2752  *
2753  * Synopsis
2754  *   void ps_button_clear(GtkButton * button, gpointer user_data)
2755  *
2756  * Description
2757  *   clear all modules from the list. (parallel select)
2758  *
2759  * Return value
2760  *   void
2761  */
ps_button_clear(GtkButton * button,gpointer user_data)2762 void ps_button_clear(GtkButton *button, gpointer user_data)
2763 {
2764 	gchar *str =
2765 		g_strdup_printf("<span weight=\"bold\">%s</span>\n\n%s",
2766 				_("Clear List?"),
2767 				_("Are you sure you want to clear the module list?"));
2768 
2769 #if GTK_CHECK_VERSION(3, 10, 0)
2770 	if (gui_yes_no_dialog(str, "dialog-warning")) {
2771 #else
2772 	if (gui_yes_no_dialog(str, GTK_STOCK_DIALOG_WARNING)) {
2773 #endif
2774 
2775 		GtkTreeModel *model =
2776 			gtk_tree_view_get_model(GTK_TREE_VIEW(parallel_select.listview));
2777 		GtkListStore *list_store = GTK_LIST_STORE(model);
2778 		gtk_list_store_clear(list_store);
2779 		if (settings.parallel_list)
2780 			g_strfreev(settings.parallel_list);
2781 		settings.parallel_list = NULL;
2782 		xml_set_value("Xiphos", "modules", "parallels", "");
2783 	}
2784 	g_free(str);
2785 }
2786 
2787 /******************************************************************************
2788  * Name
2789  *   ps_button_cut
2790  *
2791  * Synopsis
2792  *   void ps_button_cut(GtkButton * button, gpointer user_data)
2793  *
2794  * Description
2795  *   cut one module from the list. (parallel select)
2796  *
2797  * Return value
2798  *   void
2799  */
2800 void ps_button_cut(GtkButton *button, gpointer user_data)
2801 {
2802 	GtkTreeModel *model;
2803 	GtkListStore *list_store;
2804 	GtkTreeSelection *selection;
2805 	GtkTreeIter selected;
2806 	gchar *str;
2807 
2808 	model =
2809 	    gtk_tree_view_get_model(GTK_TREE_VIEW(parallel_select.listview));
2810 	list_store = GTK_LIST_STORE(model);
2811 	selection =
2812 	    gtk_tree_view_get_selection(GTK_TREE_VIEW(parallel_select.listview));
2813 
2814 	if (!gtk_tree_selection_get_selected(selection, NULL, &selected))
2815 		return;
2816 
2817 	str = g_strdup_printf("<span weight=\"bold\">%s</span>\n\n%s",
2818 			      _("Remove Module?"),
2819 			      _("Are you sure you want to remove the selected module?"));
2820 
2821 #if GTK_CHECK_VERSION(3, 10, 0)
2822 	if (gui_yes_no_dialog(str, "dialog-warning")) {
2823 #else
2824 	if (gui_yes_no_dialog(str, GTK_STOCK_DIALOG_WARNING)) {
2825 #endif
2826 		gtk_list_store_remove(list_store, &selected);
2827 		GList *mods =
2828 		    get_current_list(GTK_TREE_VIEW(parallel_select.listview));
2829 		gchar *mod_list = get_modlist_string(mods);
2830 		if (settings.parallel_list)
2831 			g_strfreev(settings.parallel_list);
2832 		settings.parallel_list = g_strsplit(mod_list, ",", -1);
2833 		xml_set_value("Xiphos", "modules", "parallels", mod_list);
2834 		g_free(mod_list);
2835 	}
2836 	g_free(str);
2837 }
2838 
2839 /******************************************************************************
2840  * Name
2841  *   ps_button_add
2842  *
2843  * Synopsis
2844  *   void ps_button_add(GtkButton * button, gpointer user_data)
2845  *
2846  * Description
2847  *   add one module from the list. (parallel select)
2848  *
2849  * Return value
2850  *   void
2851  */
2852 void ps_button_add(GtkButton *button, gpointer user_data)
2853 {
2854 #ifdef USE_GTKBUILDER
2855 	GtkBuilder *gxml;
2856 #else
2857 	GladeXML *gxml;
2858 #endif
2859 	gchar *glade_file =
2860 	    gui_general_user_file("selector-prefs" UI_SUFFIX, FALSE);
2861 	g_return_if_fail(glade_file != NULL);
2862 
2863 #ifdef USE_GTKBUILDER
2864 	gxml = gtk_builder_new();
2865 	gtk_builder_add_from_file(gxml, glade_file, NULL);
2866 #else
2867 	gxml = glade_xml_new(glade_file, "mod_sel_dialog", NULL);
2868 #endif
2869 	parallel_select.mod_sel_dialog =
2870 	    UI_GET_ITEM(gxml, "mod_sel_dialog");
2871 	parallel_select.mod_sel_close =
2872 	    UI_GET_ITEM(gxml, "mod_sel_button_close");
2873 	parallel_select.mod_sel_add =
2874 	    UI_GET_ITEM(gxml, "mod_sel_button_add");
2875 
2876 	g_signal_connect((gpointer)parallel_select.mod_sel_close,
2877 			 "clicked", G_CALLBACK(on_mod_sel_close_clicked),
2878 			 NULL);
2879 	g_signal_connect((gpointer)parallel_select.mod_sel_add, "clicked",
2880 			 G_CALLBACK(on_mod_sel_add_clicked), NULL);
2881 
2882 	parallel_select.mod_sel_treeview =
2883 	    UI_GET_ITEM(gxml, "mod_sel_treeview");
2884 	ps_setup_treeview(parallel_select.mod_sel_treeview);
2885 
2886 	gtk_widget_show(parallel_select.mod_sel_dialog);
2887 	g_free(glade_file);
2888 }
2889 
2890 /******************************************************************************
2891  * Name
2892  *   gui_create_preferences_dialog
2893  *
2894  * Synopsis
2895  *   #include "preferences_dialog.h"
2896  *   GtkWidget *gui_create_preferences_dialog(GList * biblelist,
2897  *					 GList * commlist,
2898  *					 GList * dictlist,
2899  *					 GList * percomlist,
2900  *					 GList * devotionlist)
2901  *
2902  * Description
2903  *   create preferences dialog and set to current values
2904  *
2905  * Return value
2906  *   GtkWidget *
2907  */
2908 
2909 static void create_preferences_dialog(void)
2910 {
2911 #ifdef USE_GTKBUILDER
2912 	GtkBuilder *gxml;
2913 #else
2914 	GladeXML *gxml;
2915 #endif
2916 	GtkWidget *treeview;
2917 	GtkTreeModel *model;
2918 	GObject *selection;
2919 	GtkWidget *chooser;
2920 	gint index = 0;
2921 	gchar *glade_file = gui_general_user_file("prefs" UI_SUFFIX, TRUE);
2922 
2923 	g_return_if_fail(glade_file != NULL);
2924 
2925 /* build the widget */
2926 #ifdef USE_GTKBUILDER
2927 	gxml = gtk_builder_new();
2928 	gtk_builder_add_from_file(gxml, glade_file, NULL);
2929 #else
2930 	gxml = glade_xml_new(glade_file, NULL, NULL);
2931 #endif
2932 	g_free(glade_file);
2933 	g_return_if_fail(gxml != NULL);
2934 
2935 	/* lookup the root widget */
2936 	dialog_prefs = UI_GET_ITEM(gxml, "dialog_prefs");
2937 	gtk_window_resize(GTK_WINDOW(dialog_prefs),
2938 			  settings.prefs_width, settings.prefs_height);
2939 	g_signal_connect(dialog_prefs, "response",
2940 			 G_CALLBACK(on_dialog_prefs_response), NULL);
2941 
2942 	/* color pickers */
2943 	color_picker.text_background = UI_GET_ITEM(gxml, "colorbutton1");
2944 	color_picker.text = UI_GET_ITEM(gxml, "colorbutton2");
2945 	color_picker.text_current_verse = UI_GET_ITEM(gxml, "colorbutton3");
2946 	color_picker.verse_numbers = UI_GET_ITEM(gxml, "colorbutton4");
2947 	color_picker.href_links    = UI_GET_ITEM(gxml, "colorbutton5");
2948 	color_picker.highlight_fg  = UI_GET_ITEM(gxml, "colorbutton6");
2949 	color_picker.highlight_bg  = UI_GET_ITEM(gxml, "colorbutton7");
2950 
2951 	color_picker.invert_normal = UI_GET_ITEM(gxml, "invert_normal");
2952 	color_picker.invert_highlight =
2953 	    UI_GET_ITEM(gxml, "invert_highlight");
2954 
2955 	check_button.use_linked_tabs        = UI_GET_ITEM(gxml, "checkbutton10");
2956 	check_button.readaloud              = UI_GET_ITEM(gxml, "checkbutton11");
2957 	check_button.show_verse_num         = UI_GET_ITEM(gxml, "checkbutton12");
2958 	check_button.use_default_dictionary = UI_GET_ITEM(gxml, "checkbutton6");
2959 	check_button.show_devotion          = UI_GET_ITEM(gxml, "checkbutton7");
2960 	check_button.show_splash_screen     = UI_GET_ITEM(gxml, "checkbutton8");
2961 	check_button.use_chapter_scroll     = UI_GET_ITEM(gxml, "checkbutton_scroll");
2962 
2963 	check_button.use_imageresize = UI_GET_ITEM(gxml, "checkbutton_imageresize");
2964 #ifdef WIN32
2965 	/* webkit image hackery requires resize always be enabled. */
2966 	gtk_widget_hide(check_button.use_imageresize);
2967 #endif
2968 	check_button.use_verse_num_bold        = UI_GET_ITEM(gxml, "checkbutton_verse_num_bold");
2969 	check_button.use_verse_num_bracket     = UI_GET_ITEM(gxml, "checkbutton_verse_num_bracket");
2970 	check_button.use_verse_num_superscript = UI_GET_ITEM(gxml, "checkbutton_verse_num_superscript");
2971 	check_button.versehighlight      = UI_GET_ITEM(gxml, "checkbutton_versehighlight");
2972 	check_button.annotate_highlight  = UI_GET_ITEM(gxml, "checkbutton_annotate_highlight");
2973 	check_button.xrefs_in_verse_list = UI_GET_ITEM(gxml, "checkbutton_xrefs_in_verse_list");
2974 	check_button.prayerlist          = UI_GET_ITEM(gxml, "checkbutton_prayerlist");
2975 	check_button.statusbar           = UI_GET_ITEM(gxml, "checkbutton_statusbar");
2976 	check_button.alternation         = UI_GET_ITEM(gxml, "checkbutton_alternation");
2977 
2978 	/* v-- BibleSync --v */
2979 	check_button.bs_debug     = UI_GET_ITEM(gxml, "checkbutton_BSP_nav_debug");
2980 	check_button.bs_presence  = UI_GET_ITEM(gxml, "checkbutton_BSP_presence");
2981 	check_button.bs_mismatch  = UI_GET_ITEM(gxml, "checkbutton_BSP_mismatch");
2982 	check_button.bs_group_tab = UI_GET_ITEM(gxml, "checkbutton_BSP_group_tab");
2983 	check_button.bs_keyboard  = UI_GET_ITEM(gxml, "checkbutton_BSP_keyboard");
2984 	check_button.bs_privacy   = UI_GET_ITEM(gxml, "checkbutton_BSP_privacy");
2985 
2986 	radio_button.bs_mode_off      = UI_GET_ITEM(gxml, "radiobutton_BSP_off");
2987 	radio_button.bs_mode_personal = UI_GET_ITEM(gxml, "radiobutton_BSP_personal");
2988 	radio_button.bs_mode_speaker  = UI_GET_ITEM(gxml, "radiobutton_BSP_speaker");
2989 	radio_button.bs_mode_audience = UI_GET_ITEM(gxml, "radiobutton_BSP_audience");
2990 
2991 	radio_button.bs_nav_direct    = UI_GET_ITEM(gxml, "radiobutton_BSP_nav_direct");
2992 	radio_button.bs_nav_verselist = UI_GET_ITEM(gxml, "radiobutton_BSP_nav_verselist");
2993 
2994 	radio_button.bs_listen_some = UI_GET_ITEM(gxml, "radiobutton_BSP_listen_some");
2995 	radio_button.bs_listen_all  = UI_GET_ITEM(gxml, "radiobutton_BSP_listen_all");
2996 	radio_button.bs_listen_none = UI_GET_ITEM(gxml, "radiobutton_BSP_listen_none");
2997 
2998 	speaker_window = UI_GET_ITEM(gxml, "speakerwindow");
2999 	biblesync_update_speaker();
3000 	/* ^-- BibleSync --^ */
3001 
3002 	g_signal_connect(color_picker.text_background, "color_set",
3003 			 G_CALLBACK(on_colorbutton1_color_set), NULL);
3004 	g_signal_connect(color_picker.text, "color_set",
3005 			 G_CALLBACK(on_colorbutton2_color_set), NULL);
3006 	g_signal_connect(color_picker.text_current_verse, "color_set",
3007 			 G_CALLBACK(on_colorbutton3_color_set), NULL);
3008 	g_signal_connect(color_picker.verse_numbers, "color_set",
3009 			 G_CALLBACK(on_colorbutton4_color_set), NULL);
3010 	g_signal_connect(color_picker.href_links, "color_set",
3011 			 G_CALLBACK(on_colorbutton5_color_set), NULL);
3012 	g_signal_connect(color_picker.highlight_fg, "color_set",
3013 			 G_CALLBACK(on_colorbutton6_color_set), NULL);
3014 	g_signal_connect(color_picker.highlight_bg, "color_set",
3015 			 G_CALLBACK(on_colorbutton7_color_set), NULL);
3016 	setup_color_pickers();
3017 
3018 	/* color inverters */
3019 	g_signal_connect((gpointer)color_picker.invert_normal, "clicked",
3020 			 G_CALLBACK(on_invert), (void *)1);
3021 	g_signal_connect((gpointer)color_picker.invert_highlight,
3022 			 "clicked", G_CALLBACK(on_invert), (void *)0);
3023 
3024 	/* check buttons */
3025 
3026 	/* chapter scroll doesn't work in anything but gtkhtml3. */
3027 	gtk_widget_hide(check_button.use_chapter_scroll);
3028 
3029 	setup_check_buttons();
3030 
3031 	/* verse number size */
3032 	index = get_font_size_index(settings.verse_num_font_size_str);
3033 	combo.verse_number_size = UI_GET_ITEM(gxml, "combobox1");
3034 	gtk_combo_box_set_active(GTK_COMBO_BOX(combo.verse_number_size),
3035 				 index);
3036 	g_signal_connect(combo.verse_number_size, "changed",
3037 			 G_CALLBACK(on_combobox1_changed), NULL);
3038 
3039 	/* base font size */
3040 	index = get_font_size_index(settings.base_font_size_str);
3041 	combo.base_font_size = UI_GET_ITEM(gxml, "basecombobox1");
3042 	gtk_combo_box_set_active(GTK_COMBO_BOX(combo.base_font_size),
3043 				 index);
3044 	g_signal_connect(combo.base_font_size, "changed",
3045 			 G_CALLBACK(on_basecombobox1_changed), NULL);
3046 
3047 	/* module combos */
3048 	combo.default_dictionary_module = UI_GET_ITEM(gxml, "combobox5");
3049 	combo.percomm_module = UI_GET_ITEM(gxml, "combobox6");
3050 	combo.devotion_module = UI_GET_ITEM(gxml, "combobox12");
3051 	combo.hebrew_lex__module = UI_GET_ITEM(gxml, "combobox13");
3052 	combo.greek_lex__module = UI_GET_ITEM(gxml, "combobox14");
3053 	setup_module_comboboxes();
3054 
3055 	combo.special_locale = UI_GET_ITEM(gxml, "combobox16");
3056 	setup_locale_combobox();
3057 
3058 	combo.font_prefs = UI_GET_ITEM(gxml, "combobox17");
3059 	setup_font_prefs_combobox();
3060 
3061 	/* studypad directory chooserbutton */
3062 	chooser = UI_GET_ITEM(gxml, "filechooserbutton1");
3063 	gtk_file_chooser_set_current_folder((GtkFileChooser *)chooser,
3064 					    settings.studypaddir);
3065 	g_signal_connect(chooser, "current_folder_changed",
3066 			 G_CALLBACK(on_folder_changed), NULL);
3067 
3068 	/* prefs notebook */
3069 	notebook = UI_GET_ITEM(gxml, "notebook");
3070 	/* setup treeview */
3071 	model = create_model();
3072 	treeview = UI_GET_ITEM(gxml, "treeview");
3073 	gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), model);
3074 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
3075 	gtk_widget_set_size_request(treeview, 130, -1);
3076 	add_columns(treeview);
3077 	gtk_tree_view_expand_all(GTK_TREE_VIEW(treeview));
3078 	selection =
3079 	    G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)));
3080 /* connect signals and data */
3081 #ifdef USE_GTKBUILDER
3082 	gtk_builder_connect_signals_full(gxml, (GtkBuilderConnectFunc)gui_glade_signal_connect_func,
3083 					 NULL);
3084 #else
3085 	glade_xml_signal_autoconnect_full(gxml, (GladeXMLConnectFunc)gui_glade_signal_connect_func,
3086 					  NULL);
3087 #endif
3088 
3089 	g_signal_connect(selection, "changed",
3090 			 G_CALLBACK(tree_selection_changed), model);
3091 
3092 	/*
3093 	 * parallel select dialog: chooser and button connectivity
3094 	 */
3095 	parallel_select.button_clear =
3096 	    UI_GET_ITEM(gxml, "ps_toolbutton_clear");
3097 	parallel_select.button_cut =
3098 	    UI_GET_ITEM(gxml, "ps_toolbutton_cut");
3099 	parallel_select.button_add =
3100 	    UI_GET_ITEM(gxml, "ps_toolbutton_add");
3101 	parallel_select.listview = UI_GET_ITEM(gxml, "ps_listview");
3102 
3103 	g_signal_connect(parallel_select.button_clear, "clicked",
3104 			 G_CALLBACK(ps_button_clear), NULL);
3105 	g_signal_connect(parallel_select.button_cut, "clicked",
3106 			 G_CALLBACK(ps_button_cut), NULL);
3107 	g_signal_connect(parallel_select.button_add, "clicked",
3108 			 G_CALLBACK(ps_button_add), NULL);
3109 
3110 	ps_setup_listview();
3111 
3112 	/* geometry notifications */
3113 	g_signal_connect((gpointer)dialog_prefs,
3114 			 "configure_event",
3115 			 G_CALLBACK(on_prefs_configure_event), NULL);
3116 
3117 	settings.display_prefs = 1;
3118 	xml_set_value("Xiphos", "layout", "prefsopen", "1");
3119 
3120 	/*
3121 	 * (from xiphos.c)
3122 	 * a little paranoia:
3123 	 * clamp geometry values to a reasonable bound.
3124 	 * sometimes xiphos gets insane reconfig events as it dies,
3125 	 * especially if it's due to just shutting linux down.
3126 	 */
3127 	if ((settings.prefs_x < 0) || (settings.prefs_x > 2000))
3128 		settings.prefs_x = 40;
3129 	if ((settings.prefs_y < 0) || (settings.prefs_y > 2000))
3130 		settings.prefs_y = 40;
3131 
3132 	gtk_window_move(GTK_WINDOW(dialog_prefs), settings.prefs_x,
3133 			settings.prefs_y);
3134 }
3135 
3136 /******************************************************************************
3137  * Name
3138  *   gui_setup_preferences_dialog
3139  *
3140  * Synopsis
3141  *   #include "preferences_dialog.h"
3142  *
3143  *   void gui_setup_preferences_dialog(void)
3144  *
3145  * Description
3146  *   get module list and setup preferences dialog call
3147  *   gui_create_preferences_dialog() to create dialog
3148  *
3149  * Return value
3150  *   void
3151  */
3152 
3153 void gui_setup_preferences_dialog(void)
3154 {
3155 	if (dialog_prefs == NULL) {
3156 		create_preferences_dialog();
3157 	} else
3158 		gdk_window_raise(gtk_widget_get_window(GTK_WIDGET(dialog_prefs)));
3159 }
3160