1 /*
2  * Xiphos Bible Study Tool
3  * main_menu.c - creation of and call backs for xiphos main menu
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 <gtk/gtk.h>
27 #include <unistd.h>
28 
29 #ifndef USE_GTKBUILDER
30 #include <glade/glade-xml.h>
31 #endif
32 
33 #ifdef USE_WEBKIT_EDITOR
34 #include "editor/webkit_editor.h"
35 #include "editor/editor.h"
36 #else
37 #include "editor/slib-editor.h"
38 #endif
39 
40 #include "gui/about_xiphos.h"
41 #include "gui/about_sword.h"
42 #include "gui/about_modules.h"
43 #include "gui/about_trans.h"
44 #include "gui/xiphos.h"
45 #include "gui/main_window.h"
46 #include "gui/main_menu.h"
47 #include "gui/mod_mgr.h"
48 #include "gui/preferences_dialog.h"
49 #include "gui/parallel_tab.h"
50 #include "gui/sidebar.h"
51 #include "gui/sidebar_dialog.h"
52 #include "gui/search_dialog.h"
53 #include "gui/tabbed_browser.h"
54 #include "gui/utilities.h"
55 #include "gui/widgets.h"
56 
57 #include "main/lists.h"
58 #include "main/sword.h"
59 #include "main/search_dialog.h"
60 #include "main/tab_history.h"
61 #include "main/url.hh"
62 #include "main/xml.h"
63 
64 #include <glib/gstdio.h>
65 
66 #include "gui/debug_glib_null.h"
67 
68 //global function to handle gtk_uri calls
69 /*void
70 link_uri_hook(GtkLinkButton *button,
71 	      const gchar *link,
72 	      gpointer user_data)
73 {
74 	xiphos_open_default(link);
75 }*/
76 
77 /******************************************************************************
78  * Name
79  *  on_help_contents_activate
80  *
81  * Synopsis
82  *   #include "gui/main_menu.h"
83  *
84  *   void on_help_contents_activate(GtkMenuItem * menuitem,
85  *						gpointer user_data)
86  *
87  * Description
88  *   display the help contents file
89  *
90  * Return value
91  *   void
92  */
93 G_MODULE_EXPORT void
on_help_contents_activate(GtkMenuItem * menuitem,gpointer user_data)94 on_help_contents_activate(GtkMenuItem *menuitem, gpointer user_data)
95 {
96 #ifdef WIN32
97 	const char *lang = g_getenv("LANG");
98 	gchar *help_file =
99 	    g_win32_get_package_installation_directory_of_module(NULL);
100 	help_file = g_strconcat(help_file, "\0", NULL);
101 	if (!strncmp(lang, "fr", 2))
102 		help_file =
103 		    g_build_filename(help_file, "share", "help",
104 				     "xiphos_fr.chm", NULL);
105 	else if (!strncmp(lang, "fa", 2))
106 		help_file =
107 		    g_build_filename(help_file, "share", "help",
108 				     "xiphos_fa.chm", NULL);
109 	else if (!strncmp(lang, "it", 2))
110 		help_file =
111 		    g_build_filename(help_file, "share", "help",
112 				     "xiphos_it.chm", NULL);
113 	else
114 		help_file =
115 		    g_build_filename(help_file, "share", "help",
116 				     "xiphos_C.chm", NULL);
117 	xiphos_open_default(help_file);
118 	g_free(help_file);
119 #else
120 	GError *error = NULL;
121 #if GTK_CHECK_VERSION(3, 22, 0)
122 	gtk_show_uri_on_window(NULL, "help:xiphos", gtk_get_current_event_time(),
123 			       &error);
124 #else
125 	gtk_show_uri(NULL, "help:xiphos", gtk_get_current_event_time(),
126 		     &error);
127 
128 #endif /* GTK_CHECK_VERSION */
129 	if (error != NULL) {
130 		XI_warning(("%s", error->message));
131 		g_error_free(error);
132 	}
133 #endif /* WIN32 */
134 }
135 
136 /******************************************************************************
137  * Name
138  *  on_mailing_list_activate
139  *
140  * Synopsis
141  *   #include "gui/main_menu.h"
142  *
143  *   void on_mailing_list_activate(GtkMenuItem * menuitem,
144  *						gpointer user_data)
145  *
146  * Description
147  *   open web browser to the mailing list signup page
148  *
149  * Return value
150  *   void
151  */
152 G_MODULE_EXPORT void
on_mailing_list_activate(GtkMenuItem * menuitem,gpointer user_data)153 on_mailing_list_activate(GtkMenuItem *menuitem, gpointer user_data)
154 {
155 	xiphos_open_default("http://www.crosswire.org/mailman/listinfo/xiphos-users/");
156 }
157 
158 /******************************************************************************
159  * Name
160  *  on_view_releases_activate
161  *
162  * Synopsis
163  *   #include "gui/main_menu.h"
164  *
165  *   void on_view_releases_activate(GtkMenuItem * menuitem,
166  *				    gpointer user_data)
167  *
168  * Description
169  *   open web browser to GitHub releases page.
170  *
171  * Return value
172  *   void
173  */
174 G_MODULE_EXPORT void
on_view_releases_activate(GtkMenuItem * menuitem,gpointer user_data)175 on_view_releases_activate(GtkMenuItem *menuitem, gpointer user_data)
176 {
177 	xiphos_open_default("https://github.com/crosswire/xiphos/releases/");
178 }
179 
180 /******************************************************************************
181  * Name
182  *  on_live_chat_activate
183  *
184  * Synopsis
185  *   #include "gui/main_menu.h"
186  *
187  *   void on_live_chat_activate(GtkMenuItem * menuitem,
188  *						gpointer user_data)
189  *
190  * Description
191  *   open web browser to freenode irc chat
192  *
193  * Return value
194  *   void
195  */
196 G_MODULE_EXPORT void
on_live_chat_activate(GtkMenuItem * menuitem,gpointer user_data)197 on_live_chat_activate(GtkMenuItem *menuitem, gpointer user_data)
198 {
199 	gchar *user = g_strdup_printf("%s", g_get_user_name()), *s, *url;
200 	gchar version[] = VERSION;
201 	int i;
202 	gchar platform =
203 #ifdef WIN32
204 	    'W'
205 #else
206 	    'L'
207 #endif
208 	    ;
209 
210 	/* no periods in irc nicks. */
211 	for (i = 0; version[i]; ++i)
212 		if (version[i] == '.')
213 			version[i] = '-';
214 
215 	/* mibbit nick length limit = 16 chars. */
216 	/* cut name off at 8, leaving 8 for "|platform+version". */
217 	if (strlen(user) > 8)
218 		user[8] = '\0';
219 
220 	/* no blanks in irc nicks. */
221 	for (s = strchr(user, ' '); s; s = strchr(s, ' '))
222 		*s = '_';
223 
224 	url =
225 	    g_strdup_printf("http://webchat.freenode.net/?nick=%s|%c%s&channels=xiphos&prompt=1",
226 			    user, platform, version);
227 	xiphos_open_default(url);
228 	g_free(url);
229 	g_free(user);
230 }
231 
232 /******************************************************************************
233  * Name
234  *  on_report_bug_activate
235  *
236  * Synopsis
237  *   #include "gui/main_menu.h"
238  *
239  *   void on_report_bug_activate(GtkMenuItem * menuitem,
240  *						gpointer user_data)
241  *
242  * Description
243  *   open web browser to github bug tracker
244  *
245  * Return value
246  *   void
247  */
248 G_MODULE_EXPORT void
on_report_bug_activate(GtkMenuItem * menuitem,gpointer user_data)249 on_report_bug_activate(GtkMenuItem *menuitem, gpointer user_data)
250 {
251 	xiphos_open_default(PACKAGE_BUGREPORT);
252 }
253 
254 /******************************************************************************
255  * Name
256  *  on_about_the_sword_project_activate
257  *
258  * Synopsis
259  *   #include "gui/main_menu.h"
260  *
261  *   void on_about_the_sword_project1_activate(GtkMenuItem * menuitem,
262  *						gpointer user_data)
263  *
264  * Description
265  *   display - The SWORD Project - about information
266  *
267  * Return value
268  *   void
269  */
270 G_MODULE_EXPORT void
on_about_the_sword_project_activate(GtkMenuItem * menuitem,gpointer user_data)271 on_about_the_sword_project_activate(GtkMenuItem *menuitem,
272 				    gpointer user_data)
273 {
274 	GtkWidget *dlg;
275 
276 	dlg = gui_create_about_sword();
277 	gtk_widget_show(dlg);
278 }
279 
280 /******************************************************************************
281  * Name
282  *  on_about_biblesync_activate
283  *
284  * Synopsis
285  *   #include "gui/main_menu.h"
286  *
287  *   void on_about_bibelsync_activate(GtkMenuItem * menuitem,
288  *				      gpointer user_data)
289  *
290  * Description
291  *   display - BibleSync - about information
292  *
293  * Return value
294  *   void
295  */
296 G_MODULE_EXPORT void
on_about_biblesync_activate(GtkMenuItem * menuitem,gpointer user_data)297 on_about_biblesync_activate(GtkMenuItem *menuitem,
298 			    gpointer user_data)
299 {
300 	GtkWidget *dlg;
301 
302 	dlg = gui_create_about_biblesync();
303 	gtk_widget_show(dlg);
304 }
305 
306 /******************************************************************************
307  * Name
308  *  on_about_translation_activate
309  *
310  * Synopsis
311  *   #include "gui/main_menu.h"
312  *
313  *   void on_about_translation_activate(GtkMenuItem * menuitem,
314  *					gpointer user_data)
315  *
316  * Description
317  *   display - The SWORD Project - about information
318  *
319  * Return value
320  *   void
321  */
322 G_MODULE_EXPORT void
on_about_translation_activate(GtkMenuItem * menuitem,gpointer user_data)323 on_about_translation_activate(GtkMenuItem *menuitem, gpointer user_data)
324 {
325 	GtkWidget *dlg;
326 
327 	dlg = gui_create_about_trans();
328 	gtk_widget_show(dlg);
329 }
330 
331 /******************************************************************************
332  * Name
333  *  on_daily_devotion_activate
334  *
335  * Synopsis
336  *   #include "gui/main_menu.h"
337  *
338  *   void on_daily_devotion_activate(GtkMenuItem *menuitem,
339  *						gpointer user_data)
340  *
341  * Description
342  *   display daily devotion in shortcut bar viewer
343  *
344  * Return value
345  *   void
346  */
347 G_MODULE_EXPORT void
on_daily_devotion_activate(GtkMenuItem * menuitem,gpointer user_data)348 on_daily_devotion_activate(GtkMenuItem *menuitem, gpointer user_data)
349 {
350 	main_display_devotional();
351 }
352 
353 /******************************************************************************
354  * Name
355  *  on_preferences_activate
356  *
357  * Synopsis
358  *   #include "gui/main_menu.h"
359  *
360  *   void on_preferences_activate(GtkMenuItem *menuitem, gpointer user_data)
361  *
362  * Description
363  *   open preferences dialog
364  *
365  * Return value
366  *   void
367  */
368 G_MODULE_EXPORT void
on_preferences_activate(GtkMenuItem * menuitem,gpointer user_data)369 on_preferences_activate(GtkMenuItem *menuitem, gpointer user_data)
370 {
371 	gui_setup_preferences_dialog();
372 }
373 
374 /******************************************************************************
375  * Name
376  *  on_search_activate
377  *
378  * Synopsis
379  *   #include "gui/main_menu.h"
380  *
381  *   void on_search_activate(GtkMenuItem * menuitem, gpointer user_data)
382  *
383  * Description
384  *   display search group in shortcut bar
385  *
386  * Return value
387  *   void
388  */
on_search_activate(GtkMenuItem * menuitem,gpointer user_data)389 G_MODULE_EXPORT void on_search_activate(GtkMenuItem *menuitem,
390 					gpointer user_data)
391 {
392 	if (!settings.showshortcutbar)
393 		gui_sidebar_showhide();
394 	gtk_notebook_set_current_page(GTK_NOTEBOOK(widgets.notebook_sidebar), 2);
395 }
396 
397 /******************************************************************************
398  * Name
399  *  on_linked_tabs_activate
400  *
401  * Synopsis
402  *   #include "gui/main_menu.h"
403  *
404  *   void on_linked_tabs_activate(GtkMenuItem *menuitem, gpointer user_data)
405  *
406  * Description
407  *   toggle linking tabs together.
408  *
409  * Return value
410  *   void
411  */
412 G_MODULE_EXPORT void
on_linked_tabs_activate(GtkCheckMenuItem * menuitem,gpointer user_data)413 on_linked_tabs_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
414 {
415 	settings.linkedtabs = gtk_check_menu_item_get_active(menuitem);
416 	xml_set_value("Xiphos", "misc", "pinnedtabs",
417 		      (settings.linkedtabs ? "1" : "0"));
418 	if (settings.showparatab)
419 		gui_force_parallel_tab_sync();
420 }
421 
422 /******************************************************************************
423  * Name
424  *  on_read_aloud_activate
425  *
426  * Synopsis
427  *   #include "gui/main_menu.h"
428  *
429  *   void on_read_aloud_activate(GtkMenuItem *menuitem, gpointer user_data)
430  *
431  * Description
432  *   toggle reading scripture out loud.
433  *
434  * Return value
435  *   void
436  */
437 G_MODULE_EXPORT void
on_read_aloud_activate(GtkCheckMenuItem * menuitem,gpointer user_data)438 on_read_aloud_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
439 {
440 	settings.readaloud = gtk_check_menu_item_get_active(menuitem);
441 	xml_set_value("Xiphos", "misc", "readaloud",
442 		      (settings.readaloud ? "1" : "0"));
443 	if (settings.readaloud)
444 		main_display_bible(NULL, settings.currentverse);
445 }
446 
447 /******************************************************************************
448  * Name
449  *  on_show_verse_numbers_activate
450  *
451  * Synopsis
452  *   #include "gui/main_menu.h"
453  *
454  *   void on_show_verse_numbers_activate(GtkMenuItem *menuitem, gpointer user_data)
455  *
456  * Description
457  *   toggle showing verse numbers together.
458  *
459  * Return value
460  *   void
461  */
462 G_MODULE_EXPORT void
on_show_verse_numbers_activate(GtkCheckMenuItem * menuitem,gpointer user_data)463 on_show_verse_numbers_activate(GtkCheckMenuItem *menuitem,
464 			       gpointer user_data)
465 {
466 	settings.showversenum = gtk_check_menu_item_get_active(menuitem);
467 	xml_set_value("Xiphos", "misc", "showversenum",
468 		      (settings.showversenum ? "1" : "0"));
469 	main_display_commentary(NULL, settings.currentverse);
470 	main_display_bible(NULL, settings.currentverse);
471 }
472 
473 /******************************************************************************
474  * Name
475  *  on_versehighlight_activate
476  *
477  * Synopsis
478  *   #include "gui/main_menu.h"
479  *
480  *   void on_versehighlight_activate(GtkMenuItem *menuitem, gpointer user_data)
481  *
482  * Description
483  *   toggle special current verse highlight.
484  *
485  * Return value
486  *   void
487  */
488 G_MODULE_EXPORT void
on_versehighlight_activate(GtkCheckMenuItem * menuitem,gpointer user_data)489 on_versehighlight_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
490 {
491 	settings.versehighlight = gtk_check_menu_item_get_active(menuitem);
492 	xml_set_value("Xiphos", "misc", "versehighlight",
493 		      (settings.versehighlight ? "1" : "0"));
494 	main_display_bible(NULL, settings.currentverse);
495 }
496 
497 /******************************************************************************
498  * Name
499  *  gui_parallel_tab_activate
500  *
501  * Synopsis
502  *   #include "gui/main_menu.h"
503  *
504  *   void gui_parallel_tab_activate(GtkMenuItem *menuitem, gpointer user_data)
505  *
506  * Description
507  *   toggle special current verse highlight.
508  *
509  * Return value
510  *   void
511  */
512 G_MODULE_EXPORT void
gui_parallel_tab_activate(GtkCheckMenuItem * menuitem,gpointer user_data)513 gui_parallel_tab_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
514 {
515 	if (!settings.browsing)
516 		return;
517 	if (!settings.showparatab && !gtk_check_menu_item_get_active(menuitem)) {
518 		xml_set_value("Xiphos", "misc", "showparatab", "0");
519 		return;
520 	}
521 
522 	settings.showparatab = gtk_check_menu_item_get_active(menuitem);
523 	xml_set_value("Xiphos", "misc", "showparatab",
524 		      (settings.showparatab ? "1" : "0"));
525 	if (settings.showparatab) {
526 		gui_open_parallel_view_in_new_tab();
527 		gui_force_parallel_tab_sync();
528 	} else
529 		gui_close_passage_tab(gtk_notebook_page_num(GTK_NOTEBOOK(widgets.notebook_main),
530 							    widgets.parallel_tab));
531 }
532 
533 /******************************************************************************
534  * Name
535  *  on_side_preview_activate
536  *
537  * Synopsis
538  *   #include "gui/main_menu.h"
539  *
540  *   void on_side_preview_activate(GtkMenuItem *menuitem, gpointer user_data)
541  *
542  * Description
543  *   toggle special previewer in sidebar.
544  *
545  * Return value
546  *   void
547  */
548 G_MODULE_EXPORT void
on_side_preview_activate(GtkCheckMenuItem * menuitem,gpointer user_data)549 on_side_preview_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
550 {
551 	settings.show_previewer_in_sidebar =
552 	    gtk_check_menu_item_get_active(menuitem);
553 	xml_set_value("Xiphos", "misc", "show_side_preview",
554 		      (settings.show_previewer_in_sidebar ? "1" : "0"));
555 	gui_show_previewer_in_sidebar(settings.show_previewer_in_sidebar);
556 }
557 
558 /******************************************************************************
559  * Name
560  *  on_quit_activate
561  *
562  * Synopsis
563  *   #include "gui/main_menu.h"
564  *
565  *   void on_quit_activate(GtkMenuItem * menuitem, gpointer user_data)
566  *
567  * Description
568  *   do a nice orderly shut down and exit xiphos
569  *   by calling gtk_widget_destroy() which will call
570  *   on_mainwindow_destroy()
571  *
572  * Return value
573  *   void
574  */
575 G_MODULE_EXPORT void
on_quit_activate(GtkMenuItem * menuitem,gpointer user_data)576 on_quit_activate(GtkMenuItem *menuitem, gpointer user_data)
577 {
578 	/* discover main window internal geometry before we go. */
579 	final_pane_sizes();
580 
581 #if defined(WIN32) && defined(HAVE_DBUS)
582 	/* we started dbus-daemon ourselves, so we must kill it, too. */
583 	extern GPid dbus_pid;
584 
585 	g_spawn_close_pid(dbus_pid);
586 #endif
587 
588 	/* offer to save all editors remaining open */
589 	editor_maybe_save_all();
590 
591 	shutdown_frontend();
592 	/* shutdown the sword stuff */
593 	main_shutdown_backend();
594 	gtk_main_quit();
595 	exit(0);
596 }
597 
598 /******************************************************************************
599  * Name
600  *  on_about_xiphos_activate
601  *
602  * Synopsis
603  *   #include "gui/main_menu.h"
604  *
605  *   void on_about_xiphos_activate(GtkMenuItem * menuitem,
606  *					gpointer user_data)
607  *
608  * Description
609  *   display xiphos about dialog
610  *
611  * Return value
612  *   void
613  */
614 G_MODULE_EXPORT void
on_about_xiphos_activate(GtkMenuItem * menuitem,gpointer user_data)615 on_about_xiphos_activate(GtkMenuItem *menuitem, gpointer user_data)
616 {
617 	GtkWidget *AboutBox;
618 
619 	AboutBox = gui_create_about_xiphos();
620 	gtk_widget_show(AboutBox);
621 }
622 
623 /******************************************************************************
624  * Name
625  *  on_save_session_activate
626  *
627  * Synopsis
628  *   #include "gui/main_menu.h"
629  *
630  *   void on_save_session_activate(GtkMenuItem * menuitem, gpointer user_data)
631  *
632  * Description
633  *   ask for a file name (with file-chooser) and save the current tabs to that file
634  *
635  * Return value
636  *   void
637  */
638 G_MODULE_EXPORT void
on_save_session_activate(GtkMenuItem * menuitem,gpointer user_data)639 on_save_session_activate(GtkMenuItem *menuitem, gpointer user_data)
640 {
641 	GtkWidget *dialog;
642 	gchar *tabs_dir;
643 
644 	tabs_dir = g_strdup_printf("%s/tabs/", settings.gSwordDir);
645 
646 	if (g_access(tabs_dir, F_OK) == -1) {
647 		if ((g_mkdir(tabs_dir, S_IRWXU)) == -1) {
648 			fprintf(stderr, "can't create tabs dir");
649 			return;
650 		}
651 	}
652 
653 	dialog = gtk_file_chooser_dialog_new(_("Save Session"),
654 					     NULL,
655 					     GTK_FILE_CHOOSER_ACTION_SAVE,
656 #if GTK_CHECK_VERSION(3, 10, 0)
657 					     "_Cancel",
658 					     GTK_RESPONSE_CANCEL, "_Save",
659 					     GTK_RESPONSE_ACCEPT,
660 #else
661 					     GTK_STOCK_CANCEL,
662 					     GTK_RESPONSE_CANCEL,
663 					     GTK_STOCK_SAVE,
664 					     GTK_RESPONSE_ACCEPT,
665 #endif
666 					     NULL);
667 
668 	gtk_file_chooser_set_current_folder((GtkFileChooser *)dialog,
669 					    tabs_dir);
670 	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
671 		char *filename;
672 
673 		filename =
674 		    gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
675 		filename = g_path_get_basename(filename);
676 		gui_save_tabs(filename);
677 		g_free(filename);
678 	}
679 
680 	gtk_widget_destroy(dialog);
681 }
682 
683 /******************************************************************************
684  * Name
685  *  redisplay_to_realign
686  *
687  * Synopsis
688  *   void redisplay_to_realign()
689  *
690  * Description
691  *    when en/disabling panes, we must redisplay in order that text
692  *    (especially current verse) not suddenly find itself out of view.
693  *
694  * Return value
695  *   void
696  */
redisplay_to_realign()697 void redisplay_to_realign()
698 {
699 	static int realign_busy = FALSE;
700 	int save_comm_show = settings.comm_showing;
701 
702 	if (realign_busy || change_tabs_no_redisplay)
703 		return;
704 	realign_busy = TRUE;
705 
706 	/* first realize the pane size updates. */
707 	sync_windows();
708 
709 	/* then just redisplay everything as-is. */
710 	gchar *url = g_strdup_printf("sword://%s/%s",
711 				     settings.MainWindowModule,
712 				     settings.currentverse);
713 	main_url_handler(url, TRUE);
714 	g_free(url);
715 	if (settings.DictWindowModule && *settings.DictWindowModule /* not empty */
716 	    && settings.dictkey) {
717 		url = g_strdup_printf("sword://%s/%s",
718 				      settings.DictWindowModule,
719 				      settings.dictkey);
720 		main_url_handler(url, TRUE);
721 		g_free(url);
722 	}
723 	if (settings.book_mod && *settings.book_mod /* not empty */
724 	    && settings.book_key) {
725 		url = g_strdup_printf("sword://%s/%s",
726 				      settings.book_mod,
727 				      settings.book_key);
728 		main_url_handler(url, TRUE);
729 		g_free(url);
730 	}
731 
732 	settings.comm_showing = save_comm_show;
733 	gtk_notebook_set_current_page(GTK_NOTEBOOK(widgets.notebook_comm_book),
734 				      (settings.comm_showing ? 0 : 1));
735 
736 	realign_busy = FALSE;
737 }
738 
739 /******************************************************************************
740  * Name
741  *  on_open_session_activate
742  *
743  * Synopsis
744  *   #include "gui/main_menu.h"
745  *
746  *   void on_open_session_activate(GtkMenuItem * menuitem, gpointer user_data)
747  *
748  * Description
749  *   ask for file name (with file-chooser) and load tabs from that file
750  *
751  * Return value
752  *   void
753  */
754 G_MODULE_EXPORT void
on_open_session_activate(GtkMenuItem * menuitem,gpointer user_data)755 on_open_session_activate(GtkMenuItem *menuitem, gpointer user_data)
756 {
757 	GtkWidget *dialog;
758 	gchar *tabs_dir;
759 
760 	tabs_dir = g_strdup_printf("%s/tabs/", settings.gSwordDir);
761 
762 	if (g_access(tabs_dir, F_OK) == -1) {
763 		if ((g_mkdir(tabs_dir, S_IRWXU)) == -1) {
764 			fprintf(stderr, "can't create tabs dir");
765 			return;
766 		}
767 	}
768 
769 	dialog = gtk_file_chooser_dialog_new(_("Open Session"),
770 					     NULL,
771 					     GTK_FILE_CHOOSER_ACTION_OPEN,
772 #if GTK_CHECK_VERSION(3, 10, 0)
773 					     _("_Cancel"),
774 					     GTK_RESPONSE_CANCEL, _("_Open"),
775 					     GTK_RESPONSE_ACCEPT,
776 #else
777 					     GTK_STOCK_CANCEL,
778 					     GTK_RESPONSE_CANCEL,
779 					     GTK_STOCK_OPEN,
780 					     GTK_RESPONSE_ACCEPT,
781 #endif
782 					     NULL);
783 
784 	gtk_file_chooser_set_current_folder((GtkFileChooser *)dialog,
785 					    tabs_dir);
786 	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
787 		char *filename;
788 
789 		filename =
790 		    gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
791 		filename = g_path_get_basename(filename);
792 		gui_close_all_tabs();
793 		gui_load_tabs(filename);
794 		redisplay_to_realign();
795 		g_free(filename);
796 	}
797 
798 	gtk_widget_destroy(dialog);
799 }
800 
801 /******************************************************************************
802  * Name
803  *  on_show_bible_text_activate
804  *
805  * Synopsis
806  *   #include "gui/main_menu.h"
807  *
808  *   void on_show_bible_text_activate(GtkMenuItem * menuitem, gpointer user_data)
809  *
810  * Description
811  *    toggle Bibletext window
812  *
813  * Return value
814  *   void
815  */
816 G_MODULE_EXPORT void
on_show_bible_text_activate(GtkCheckMenuItem * menuitem,gpointer user_data)817 on_show_bible_text_activate(GtkCheckMenuItem *menuitem,
818 			    gpointer user_data)
819 {
820 	gui_show_hide_texts(gtk_check_menu_item_get_active(menuitem));
821 	redisplay_to_realign();
822 }
823 
824 G_MODULE_EXPORT void
on_preview_activate(GtkCheckMenuItem * menuitem,gpointer user_data)825 on_preview_activate(GtkCheckMenuItem *menuitem, gpointer user_data)
826 {
827 	gui_show_hide_preview(gtk_check_menu_item_get_active(menuitem));
828 	redisplay_to_realign();
829 }
830 
831 /******************************************************************************
832  * Name
833  *  on_show_commentary_activate
834  *
835  * Synopsis
836  *   #include "gui/main_menu.h"
837  *
838  *   void on_show_commentary_activate(GtkMenuItem * menuitem, gpointer user_data)
839  *
840  * Description
841  *    toggle commentary window *** we need to change the name of this
842  *    function because there no longer an upper_workbook
843  *
844  * Return value
845  *   void
846  */
847 G_MODULE_EXPORT void
on_show_commentary_activate(GtkCheckMenuItem * menuitem,gpointer user_data)848 on_show_commentary_activate(GtkCheckMenuItem *menuitem,
849 			    gpointer user_data)
850 {
851 	gui_show_hide_comms(gtk_check_menu_item_get_active(menuitem));
852 	redisplay_to_realign();
853 }
854 
855 /******************************************************************************
856  * Name
857  *   on_show_dictionary_lexicon_activate
858  *
859  * Synopsis
860  *   #include "gui/main_menu.h"
861  *
862  *   void on_show_dictionary_lexicon_activate(GtkMenuItem * menuitem, gpointer user_data)
863  *
864  * Description
865  *    toggle lower_workbook view (on or off)
866  *
867  * Return value
868  *   void
869  */
870 G_MODULE_EXPORT void
on_show_dictionary_lexicon_activate(GtkCheckMenuItem * menuitem,gpointer user_data)871 on_show_dictionary_lexicon_activate(GtkCheckMenuItem *menuitem,
872 				    gpointer user_data)
873 {
874 	gui_show_hide_dicts(gtk_check_menu_item_get_active(menuitem));
875 	redisplay_to_realign();
876 }
877 
878 /******************************************************************************
879  * Name
880  *   on_module_manager_activate
881  *
882  * Synopsis
883  *   #include "gui/main_menu.h"
884  *
885  *   void on_module_manager_activate(GtkMenuItem * menuitem, gpointer user_data)
886  *
887  * Description
888  *
889  *
890  * Return value
891  *   void
892  */
893 G_MODULE_EXPORT void
on_module_manager_activate(GtkMenuItem * menuitem,gpointer user_data)894 on_module_manager_activate(GtkMenuItem *menuitem, gpointer user_data)
895 {
896 	gui_open_mod_mgr();
897 }
898 
899 /******************************************************************************
900  * Name
901  *   on_open_studypad_activate
902  *
903  * Synopsis
904  *   #include "gui/main_menu.h"
905  *
906  *   void on_open_studypad_activate(GtkMenuItem * menuitem, gpointer user_data)
907  *
908  * Description
909  *    open studypad editor - if studypad dialog exist bring it to the
910  *    top
911  *
912  * Return value
913  *   void
914  */
915 G_MODULE_EXPORT void
on_open_studypad_activate(GtkMenuItem * menuitem,gpointer user_data)916 on_open_studypad_activate(GtkMenuItem *menuitem, gpointer user_data)
917 {
918 	editor_create_new(settings.studypadfilename, NULL, FALSE);
919 	//create_window ();
920 }
921 
922 G_MODULE_EXPORT void
on_advanced_search_activate(GtkMenuItem * menuitem,gpointer user_data)923 on_advanced_search_activate(GtkMenuItem *menuitem, gpointer user_data)
924 {
925 	main_open_search_dialog();
926 }
927 
928 G_MODULE_EXPORT void
on_attach_detach_sidebar_activate(GtkMenuItem * menuitem,gpointer user_data)929 on_attach_detach_sidebar_activate(GtkMenuItem *menuitem,
930 				  gpointer user_data)
931 {
932 	gui_attach_detach_sidebar();
933 }
934 
935 G_MODULE_EXPORT void
on_sidebar_showhide_activate(GtkMenuItem * menuitem,gpointer user_data)936 on_sidebar_showhide_activate(GtkMenuItem *menuitem, gpointer user_data)
937 {
938 	gui_sidebar_showhide();
939 }
940 
gui_create_main_menu(void)941 GtkWidget *gui_create_main_menu(void)
942 {
943 #ifdef USE_GTKBUILDER
944 	GtkBuilder *gxml;
945 #else
946 	GladeXML *gxml;
947 #endif
948 	gchar *glade_file =
949 	    gui_general_user_file("xi-menus" UI_SUFFIX, FALSE);
950 	g_return_val_if_fail(glade_file != NULL, NULL);
951 
952 #ifdef USE_GTKBUILDER
953 	gxml = gtk_builder_new();
954 	gtk_builder_add_from_file(gxml, glade_file, NULL);
955 #else
956 	gxml = glade_xml_new(glade_file, "menu_main", NULL);
957 #endif
958 	g_free(glade_file);
959 	g_return_val_if_fail(gxml != NULL, NULL);
960 
961 	GtkWidget *menu = UI_GET_ITEM(gxml, "menu_main");
962 
963 	widgets.viewtexts_item = UI_GET_ITEM(gxml, "show_bible_text");
964 	widgets.viewpreview_item = UI_GET_ITEM(gxml, "preview");
965 	widgets.viewcomms_item = UI_GET_ITEM(gxml, "commentary");
966 	widgets.viewdicts_item =
967 	    UI_GET_ITEM(gxml, "show_dictionary_lexicon");
968 	widgets.linkedtabs_item = UI_GET_ITEM(gxml, "link_tabs");
969 	widgets.readaloud_item = UI_GET_ITEM(gxml, "read_aloud");
970 	widgets.showversenum_item =
971 	    UI_GET_ITEM(gxml, "show_verse_numbers");
972 	widgets.versehighlight_item =
973 	    UI_GET_ITEM(gxml, "highlight_current_verse");
974 	widgets.parallel_tab_item =
975 	    UI_GET_ITEM(gxml, "show_parallel_view_in_a_tab");
976 	widgets.side_preview_item =
977 	    UI_GET_ITEM(gxml, "show_previewer_in_sidebar");
978 	widgets.new_journal_item = UI_GET_ITEM(gxml, "newjournal");
979 
980 	/* map tab's show state into view menu. */
981 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewtexts_item),
982 				       settings.showtexts);
983 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewcomms_item),
984 				       settings.showcomms);
985 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewdicts_item),
986 				       settings.showdicts);
987 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.viewpreview_item),
988 				       settings.showpreview);
989 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.parallel_tab_item),
990 				       settings.showparatab);
991 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.side_preview_item),
992 				       settings.show_previewer_in_sidebar);
993 
994 	/* update other status toys */
995 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.linkedtabs_item),
996 				       settings.linkedtabs);
997 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.readaloud_item),
998 				       settings.readaloud);
999 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.showversenum_item),
1000 				       settings.showversenum);
1001 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widgets.versehighlight_item),
1002 				       settings.versehighlight);
1003 /* connect signals and data */
1004 #ifdef USE_GTKBUILDER
1005 	gtk_builder_connect_signals(gxml, NULL);
1006 /*gtk_builder_connect_signals_full
1007 	   (gxml, (GtkBuilderConnectFunc)gui_glade_signal_connect_func, NULL); */
1008 #else
1009 	glade_xml_signal_autoconnect_full(gxml, (GladeXMLConnectFunc)gui_glade_signal_connect_func,
1010 					  NULL);
1011 #endif
1012 	//set up global function to handle all link buttons
1013 	//      gtk_link_button_set_uri_hook (link_uri_hook, NULL, NULL);
1014 
1015 	if (settings.prayerlist)
1016 		gtk_widget_show(widgets.new_journal_item);
1017 	else
1018 		gtk_widget_hide(widgets.new_journal_item);
1019 	gtk_widget_show(menu);
1020 	return menu;
1021 }
1022