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