static void _tabs_off(void) { int page = _is_paratab_showing(); xml_set_value("Xiphos", "tabs", "browsing", "0"); gui_save_tabs(default_tab_filename); if (settings.showparatab) { gui_close_passage_tab(gtk_notebook_page_num(GTK_NOTEBOOK(widgets.notebook_main), widgets.parallel_tab)); settings.showparatab = FALSE; } gui_close_all_tabs(); settings.browsing = FALSE; gui_load_tabs(no_tab_filename); gtk_widget_hide(widgets.hboxtb); gtk_notebook_set_current_page(GTK_NOTEBOOK(widgets.notebook_bible_parallel), page); }
/****************************************************************************** * Name * on_save_session_activate * * Synopsis * #include "gui/main_menu.h" * * void on_save_session_activate(GtkMenuItem * menuitem, gpointer user_data) * * Description * ask for a file name (with file-chooser) and save the current tabs to that file * * Return value * void */ G_MODULE_EXPORT void on_save_session_activate(GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *dialog; gchar *tabs_dir; tabs_dir = g_strdup_printf("%s/tabs/", settings.gSwordDir); if (g_access(tabs_dir, F_OK) == -1) { if ((g_mkdir(tabs_dir, S_IRWXU)) == -1) { fprintf(stderr, "can't create tabs dir"); return; } } dialog = gtk_file_chooser_dialog_new("Save Session", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, #ifdef HAVE_GTK_310 "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, #else GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, #endif NULL); gtk_file_chooser_set_current_folder((GtkFileChooser *)dialog, tabs_dir); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); filename = g_path_get_basename(filename); gui_save_tabs(filename); g_free(filename); } gtk_widget_destroy(dialog); }
/****************************************************************************** * Name * gui_notebook_main_shutdown * * Synopsis * #include "tabbed_browser.h" * * void gui_notebook_main_shutdown(int tabs) * * Description * shut down main notebook and clean mem * * Return value * void */ void gui_notebook_main_shutdown(int tabs) { if (stop_refresh) return; gui_save_tabs(tabs ? default_tab_filename : no_tab_filename); passage_list = g_list_first(passage_list); while (passage_list != NULL) { PASSAGE_TAB_INFO *pt = (PASSAGE_TAB_INFO *)passage_list->data; g_free(pt->text_mod); g_free(pt->commentary_mod); g_free(pt->dictlex_mod); g_free(pt->book_mod); g_free(pt->text_commentary_key); g_free(pt->dictlex_key); g_free(pt->book_offset); g_free((PASSAGE_TAB_INFO *)passage_list->data); passage_list = g_list_next(passage_list); } g_list_free(passage_list); cur_passage_tab = NULL; }
void gui_load_tabs(const gchar *filename) { xmlDocPtr xml_doc; xmlNodePtr tmp_node, childnode; //const xmlChar *xml_filename; gboolean error = FALSE; gboolean back_compat_need_save = FALSE; settings.showparatab = FALSE; PASSAGE_TAB_INFO *pt = NULL, *pt_first = NULL; stop_refresh = TRUE; if (filename == NULL) { error = TRUE; } else { gchar *file; if (g_access(filename, F_OK) == 0) { /* we're done, just copy for local use that can be free'd */ file = g_strdup(filename); } else { gchar *tabs_dir = g_strdup_printf("%s/tabs/", settings.gSwordDir); if (g_access(tabs_dir, F_OK) == -1) { XI_message(("Creating new tabs directory\n")); gui_save_tabs(filename); } file = g_strdup_printf("%s%s", tabs_dir, filename); g_free(tabs_dir); } /* we need this for first time non tabbed browsing */ if (!settings.browsing && g_access(file, F_OK) == -1) { _save_off_tab(filename); } //xml_filename = (const xmlChar *) file; xml_doc = xmlParseFile(file); g_free(file); if (xml_doc == NULL) { gui_generic_warning_modal("Tabs document not parsed successfully."); error = TRUE; } else { tmp_node = xmlDocGetRootElement(xml_doc); if (tmp_node == NULL) { gui_generic_warning_modal("Tabs document is empty."); xmlFreeDoc(xml_doc); error = TRUE; } else if (xmlStrcmp(tmp_node->name, (const xmlChar *)"Xiphos_Tabs")) { gui_generic_warning_modal("Tabs document has wrong type, root node != Xiphos_Tabs"); xmlFreeDoc(xml_doc); error = TRUE; } } if (error == FALSE) { for (childnode = tmp_node->children; childnode != NULL; childnode = childnode->next) { if (!xmlStrcmp(childnode->name, (const xmlChar *)"tabs")) { tmp_node = childnode; for (tmp_node = tmp_node->children; tmp_node != NULL; tmp_node = tmp_node->next) { if (!xmlStrcmp(tmp_node->name, (const xmlChar *)"tab")) { gchar *val; pt = g_new0(PASSAGE_TAB_INFO, 1); if (pt_first == NULL) pt_first = pt; /* load per-tab module information. */ val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"text_mod"); pt->text_mod = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"commentary_mod"); pt->commentary_mod = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"dictlex_mod"); pt->dictlex_mod = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"book_mod"); pt->book_mod = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"text_commentary_key"); pt->text_commentary_key = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"dictlex_key"); pt->dictlex_key = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"book_offset"); pt->book_offset = g_strdup(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"comm_showing"); pt->comm_showing = yes_no2true_false(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"showparallel"); pt->showparallel = yes_no2true_false(val); xmlFree(val); if (pt->showparallel) { settings.showparatab = TRUE; pt->paratab = gui_create_parallel_tab(); gtk_box_pack_start(GTK_BOX(widgets.page), pt->paratab, TRUE, TRUE, 0); gtk_widget_hide(pt->paratab); gui_parallel_tab_sync((gchar *) settings.currentverse); settings.showparatab = TRUE; sync_on = TRUE; } else pt->paratab = NULL; /* * load per-tab "show" state. * includes backward compatibility: * if there is no per-tab state, * take tab state from global state. */ if ((val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"showtexts"))) { pt->showtexts = yes_no2true_false(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"showpreview"); pt->showpreview = yes_no2true_false(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"showcomms"); pt->showcomms = yes_no2true_false(val); xmlFree(val); val = (gchar *) xmlGetProp(tmp_node, (const xmlChar *)"showdicts"); pt->showdicts = yes_no2true_false(val); xmlFree(val); } else { pt->showtexts = settings.showtexts; pt->showpreview = settings.showpreview; pt->showcomms = settings.showcomms; pt->showdicts = settings.showdicts; back_compat_need_save = TRUE; } pt->history_items = 0; pt->current_history_item = 0; pt->first_back_click = TRUE; main_add_tab_history_item((PASSAGE_TAB_INFO *)pt); gui_reassign_strdup(&settings.currentverse, pt->text_commentary_key); passage_list = g_list_append(passage_list, (PASSAGE_TAB_INFO *)pt); notebook_main_add_page(pt); } } } } } xmlFreeDoc(xml_doc); /* backward compatibility completion. */ if (back_compat_need_save) gui_save_tabs(filename); if (error == TRUE || pt == NULL) { pt = g_new0(PASSAGE_TAB_INFO, 1); pt->text_mod = g_strdup(settings.MainWindowModule); pt->commentary_mod = g_strdup(settings.CommWindowModule); pt->dictlex_mod = g_strdup(settings.DictWindowModule); pt->book_mod = g_strdup(settings.book_mod); //NULL; pt->text_commentary_key = g_strdup(settings.currentverse); pt->dictlex_key = g_strdup(settings.dictkey); pt->book_offset = NULL; //settings.book_offset = atol(xml_get_value( "keys", "offset")); pt->paratab = NULL; pt->showtexts = settings.showtexts; pt->showpreview = settings.showpreview; pt->showcomms = settings.showcomms; pt->showdicts = settings.showdicts; pt->history_items = 0; pt->current_history_item = 0; pt->first_back_click = TRUE; // main_add_tab_history_item((PASSAGE_TAB_INFO*)pt); passage_list = g_list_append(passage_list, (PASSAGE_TAB_INFO *)pt); notebook_main_add_page(pt); } else { // first passage is current/displayed. pt = pt_first; pt->paratab = NULL; // This is a hack to keep gs from loading the settings // from the last session into the last tab loaded here. gui_reassign_strdup(&settings.MainWindowModule, pt->text_mod); gui_reassign_strdup(&settings.CommWindowModule, pt->commentary_mod); gui_reassign_strdup(&settings.DictWindowModule, pt->dictlex_mod); gui_reassign_strdup(&settings.book_mod, pt->book_mod); gui_reassign_strdup(&settings.currentverse, pt->text_commentary_key); gui_reassign_strdup(&settings.dictkey, pt->dictlex_key); settings.book_offset = atol(pt->book_offset); } } stop_refresh = FALSE; set_current_tab(pt); gui_recompute_view_menu_choices(); }