42
43
#include <gdk/gdkkeysyms.h>
43
44
#include <glade/glade.h>
47
#include "html-factory.h"
46
48
#include "booktree.h"
47
49
#include "ui_bookmarks.h"
52
#include "utils/utils.h"
54
#include "models/chmfile-factory.h"
56
struct _ChmSeePrivate {
57
GtkWidget *control_notebook;
58
GtkWidget *html_notebook;
61
GtkWidget *bookmark_tree;
62
GtkWidget *index_tree;
84
#define selfp (self->priv)
85
#define CHMSEE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_CHMSEE, ChmSeePrivate))
52
87
static void chmsee_class_init(ChmSeeClass *);
53
88
static void chmsee_init(ChmSee *);
54
89
static void chmsee_finalize(GObject *);
90
static void chmsee_dispose(GObject* self);
91
static void chmsee_load_config(ChmSee *self);
92
static void chmsee_save_config(ChmSee *self);
93
static void chmsee_set_fullscreen(ChmSee* self, gboolean fullscreen);
56
95
static gboolean delete_cb(GtkWidget *, GdkEvent *, ChmSee *);
57
96
static void destroy_cb(GtkWidget *, ChmSee *);
58
static gboolean configure_event_cb(GtkWidget *, GdkEventConfigure *, ChmSee *);
97
static gboolean on_configure_event(GtkWidget *, GdkEventConfigure *, ChmSee *);
60
static gboolean keypress_event_cb(GtkWidget *, GdkEventKey *, ChmSee *);
99
static gboolean on_keypress_event(GtkWidget *, GdkEventKey *, ChmSee *);
61
100
static void open_response_cb(GtkWidget *, gint, ChmSee *);
62
101
static void about_response_cb(GtkDialog *, gint, gpointer);
63
102
static void booktree_link_selected_cb(GObject *, Link *, ChmSee *);
64
103
static void bookmarks_link_selected_cb(GObject *, Link *, ChmSee *);
65
104
static void control_switch_page_cb(GtkNotebook *, GtkNotebookPage *, guint , ChmSee *);
66
105
static void html_switch_page_cb(GtkNotebook *, GtkNotebookPage *, guint , ChmSee *);
67
static void html_location_changed_cb(Html *, const gchar *, ChmSee *);
68
static gboolean html_open_uri_cb(Html *, const gchar *, ChmSee *);
69
static void html_title_changed_cb(Html *, const gchar *, ChmSee *);
70
static void html_context_normal_cb(Html *, ChmSee *);
71
static void html_context_link_cb(Html *, const gchar *, ChmSee *);
72
static void html_open_new_tab_cb(Html *, const gchar *, ChmSee *);
73
static void html_link_message_cb(Html *, const gchar *, ChmSee *);
106
static void html_location_changed_cb(ChmseeIhtml *, const gchar *, ChmSee *);
107
static gboolean html_open_uri_cb(ChmseeIhtml *, const gchar *, ChmSee *);
108
static void html_title_changed_cb(ChmseeIhtml *, const gchar *, ChmSee *);
109
static void html_context_normal_cb(ChmseeIhtml *, ChmSee *);
110
static void html_context_link_cb(ChmseeIhtml *, const gchar *, ChmSee *);
111
static void html_open_new_tab_cb(ChmseeIhtml *, const gchar *, ChmSee *);
112
static void html_link_message_cb(ChmseeIhtml *, const gchar *, ChmSee *);
113
static void show_sidepane(ChmSee* self);
114
static void hide_sidepane(ChmSee* self);
115
static void set_sidepane_state(ChmSee* self, gboolean state);
75
117
static void on_open(GtkWidget *, ChmSee *);
76
118
static void on_close_tab(GtkWidget *, ChmSee *);
89
131
static void on_close_current_tab(GtkWidget *, ChmSee *);
90
132
static void on_context_new_tab(GtkWidget *, ChmSee *);
91
133
static void on_context_copy_link(GtkWidget *, ChmSee *);
134
static void on_fullscreen_toggled(ChmSee* self, GtkWidget* menu);
135
static void on_sidepane_toggled(ChmSee* self, GtkWidget* menu);
136
static void on_map(ChmSee* self);
137
static gboolean on_window_state_event(ChmSee* self, GdkEventWindowState* event);
138
static gboolean on_scroll_event(ChmSee* self, GdkEventScroll* event);
93
140
static void chmsee_quit(ChmSee *);
94
141
static void chmsee_open_uri(ChmSee *chmsee, const gchar *uri);
142
static void chmsee_open_file(ChmSee *self, const gchar *filename);
95
143
static GtkWidget *get_widget(ChmSee *, gchar *);
96
static void window_populate(ChmSee *);
97
static void display_book(ChmSee *, ChmFile *);
144
static void populate_window(ChmSee *);
145
static void display_book(ChmSee *, ChmseeIchmfile *);
98
146
static void close_current_book(ChmSee *);
99
147
static void new_tab(ChmSee *, const gchar *);
100
static Html *get_active_html(ChmSee *);
101
static void check_history(ChmSee *, Html *);
102
static void update_tab_title(ChmSee *, Html *);
103
static void tab_set_title(ChmSee *, Html *, const gchar *);
148
static ChmseeIhtml *get_active_html(ChmSee *);
149
static void check_history(ChmSee *, ChmseeIhtml *);
150
static void update_tab_title(ChmSee *, ChmseeIhtml *);
151
static void tab_set_title(ChmSee *, ChmseeIhtml *, const gchar *);
104
152
static void open_homepage(ChmSee *);
105
153
static void reload_current_page(ChmSee *);
106
154
static void update_status_bar(ChmSee *, const gchar *);
116
164
static gchar *context_menu_link = NULL;
117
static GtkWindowClass *parent_class = NULL;
118
165
static const GtkTargetEntry view_drop_targets[] = {
119
166
{ "text/uri-list", 0, 0 }
123
chmsee_get_type(void)
125
static GType type = 0;
128
static const GTypeInfo info = {
132
(GClassInitFunc)chmsee_class_init,
137
(GInstanceInitFunc)chmsee_init,
140
type = g_type_register_static(GTK_TYPE_WINDOW,
169
G_DEFINE_TYPE (ChmSee, chmsee, GTK_TYPE_WINDOW);
149
172
chmsee_class_init(ChmSeeClass *klass)
151
GObjectClass *object_class = G_OBJECT_CLASS(klass);
152
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
153
parent_class = g_type_class_peek_parent(klass);
155
object_class->finalize = chmsee_finalize;
156
widget_class->drag_data_received = chmsee_drag_data_received;
174
g_type_class_add_private(klass, sizeof(ChmSeePrivate));
175
G_OBJECT_CLASS(klass)->finalize = chmsee_finalize;
176
G_OBJECT_CLASS(klass)->dispose = chmsee_dispose;
177
GTK_WIDGET_CLASS(klass)->drag_data_received = chmsee_drag_data_received;
160
chmsee_init(ChmSee *chmsee)
181
chmsee_init(ChmSee* self)
162
chmsee->home = g_build_filename(g_get_home_dir(), ".chmsee", NULL);
164
g_debug("chmsee home = %s", chmsee->home);
166
if (!g_file_test(chmsee->home, G_FILE_TEST_IS_DIR))
167
mkdir(chmsee->home, 0777);
169
chmsee->cache_dir = g_build_filename(chmsee->home, "bookshelf", NULL);
171
if (!g_file_test(chmsee->cache_dir, G_FILE_TEST_IS_DIR))
172
mkdir(chmsee->cache_dir, 0777);
175
chmsee->last_dir = g_strdup(g_get_home_dir());
178
chmsee->html_notebook = NULL;
179
chmsee->pos_x = -100;
180
chmsee->pos_y = -100;
183
chmsee->has_toc = FALSE;
184
chmsee->has_index = FALSE;
186
g_signal_connect(G_OBJECT (chmsee),
188
G_CALLBACK (keypress_event_cb),
190
gtk_drag_dest_set (GTK_WIDGET (chmsee),
191
GTK_DEST_DEFAULT_ALL,
193
G_N_ELEMENTS (view_drop_targets),
183
self->priv = CHMSEE_GET_PRIVATE(self);
184
selfp->home = g_build_filename(g_get_home_dir(), ".chmsee", NULL);
186
g_debug("chmsee home = %s", selfp->home);
188
if (!g_file_test(selfp->home, G_FILE_TEST_IS_DIR))
189
mkdir(selfp->home, 0777);
191
selfp->cache_dir = g_build_filename(selfp->home, "bookshelf", NULL);
193
if (!g_file_test(selfp->cache_dir, G_FILE_TEST_IS_DIR))
194
mkdir(selfp->cache_dir, 0777);
197
selfp->last_dir = g_strdup(g_get_home_dir());
200
selfp->html_notebook = NULL;
205
selfp->hpaned_position = -1;
206
selfp->has_toc = FALSE;
207
selfp->has_index = FALSE;
208
selfp->fullscreen = FALSE;
210
gtk_widget_add_events(GTK_WIDGET(self),
211
GDK_STRUCTURE_MASK | GDK_BUTTON_PRESS_MASK );
213
g_signal_connect(G_OBJECT (self),
215
G_CALLBACK (on_keypress_event),
217
g_signal_connect(G_OBJECT(self),
219
G_CALLBACK(on_scroll_event),
221
g_signal_connect(G_OBJECT(self),
225
g_signal_connect(G_OBJECT(self),
226
"window-state-event",
227
G_CALLBACK(on_window_state_event),
229
gtk_drag_dest_set (GTK_WIDGET (self),
230
GTK_DEST_DEFAULT_ALL,
232
G_N_ELEMENTS (view_drop_targets),
199
238
chmsee_finalize(GObject *object)
201
G_OBJECT_CLASS (parent_class)->finalize (object);
240
ChmSee* self = CHMSEE(object);
247
if(selfp->cache_dir) {
248
g_free(selfp->cache_dir);
249
selfp->cache_dir = NULL;
252
if(selfp->last_dir) {
253
g_free(selfp->last_dir);
254
selfp->last_dir = NULL;
256
G_OBJECT_CLASS (chmsee_parent_class)->finalize (object);
259
static void chmsee_dispose(GObject* gobject)
261
ChmSee* self = CHMSEE(gobject);
264
g_object_unref(selfp->book);
268
if(selfp->html_notebook) {
269
g_object_unref(selfp->html_notebook);
270
selfp->html_notebook = NULL;
273
G_OBJECT_CLASS(chmsee_parent_class)->dispose(gobject);
298
html_switch_page_cb(GtkNotebook *notebook, GtkNotebookPage *page, guint new_page_num, ChmSee *chmsee)
384
html_switch_page_cb(GtkNotebook *notebook, GtkNotebookPage *page, guint new_page_num, ChmSee *self)
300
386
GtkWidget *new_page;
302
388
new_page = gtk_notebook_get_nth_page(notebook, new_page_num);
306
gchar *title, *location;
391
ChmseeIhtml* new_html;
393
const gchar* location;
308
395
new_html = g_object_get_data(G_OBJECT (new_page), "html");
310
update_tab_title(chmsee, new_html);
397
update_tab_title(self, new_html);
312
title = html_get_title(new_html);
313
location = html_get_location(new_html);
399
title = chmsee_ihtml_get_title(new_html);
400
location = chmsee_ihtml_get_location(new_html);
315
402
if (location != NULL && strlen(location)) {
316
403
if (strlen(title)) {
317
ui_bookmarks_set_current_link(UIBOOKMARKS (chmsee->bookmark_tree), title, location);
404
ui_bookmarks_set_current_link(UIBOOKMARKS (selfp->bookmark_tree), title, location);
319
406
const gchar *book_title;
321
book_title = booktree_get_selected_book_title(BOOKTREE (chmsee->booktree));
322
ui_bookmarks_set_current_link(UIBOOKMARKS (chmsee->bookmark_tree), book_title, location);
408
book_title = booktree_get_selected_book_title(BOOKTREE (selfp->booktree));
409
ui_bookmarks_set_current_link(UIBOOKMARKS (selfp->bookmark_tree), book_title, location);
325
412
/* Sync the book tree. */
327
booktree_select_uri(BOOKTREE (chmsee->booktree), location);
414
booktree_select_uri(BOOKTREE (selfp->booktree), location);
330
check_history(chmsee, new_html);
417
check_history(self, new_html);
332
gtk_window_set_title(GTK_WINDOW (chmsee), "ChmSee");
333
check_history(chmsee, NULL);
419
gtk_window_set_title(GTK_WINDOW (self), "ChmSee");
420
check_history(self, NULL);
338
html_location_changed_cb(Html *html, const gchar *location, ChmSee *chmsee)
425
html_location_changed_cb(ChmseeIhtml *html, const gchar *location, ChmSee *chmsee)
340
427
g_debug("html location changed cb: %s", location);
347
html_open_uri_cb(Html *html, const gchar *uri, ChmSee *chmsee)
434
html_open_uri_cb(ChmseeIhtml* html, const gchar *uri, ChmSee *self)
349
436
static const char* prefix = "file://";
350
437
static int prefix_len = 7;
352
439
if(g_str_has_prefix(uri, prefix)) {
353
440
/* FIXME: can't disable the DND function of GtkMozEmbed */
354
441
if(g_str_has_suffix(uri, ".chm")
355
442
|| g_str_has_suffix(uri, ".CHM")) {
356
chmsee_open_uri(chmsee, uri);
443
chmsee_open_uri(self, uri);
359
446
if(g_access(uri+prefix_len, R_OK) < 0) {
360
447
gchar* newfname = correct_filename(uri+prefix_len);
362
449
g_message(_("URI redirect: \"%s\" -> \"%s\""), uri, newfname);
363
html_open_uri(html, newfname);
450
chmsee_ihtml_open_uri(html, newfname);
364
451
g_free(newfname);
370
if ((html == get_active_html(chmsee)) && chmsee->has_toc)
371
booktree_select_uri(BOOKTREE (chmsee->booktree), uri);
457
if ((html == get_active_html(self)) && selfp->has_toc)
458
booktree_select_uri(BOOKTREE (selfp->booktree), uri);
377
html_title_changed_cb(Html *html, const gchar *title, ChmSee *chmsee)
464
html_title_changed_cb(ChmseeIhtml *html, const gchar *title, ChmSee *self)
466
const gchar *location;
381
468
g_debug("html title changed cb %s", title);
383
update_tab_title(chmsee, get_active_html(chmsee));
470
update_tab_title(self, get_active_html(self));
385
location = html_get_location(html);
472
location = chmsee_ihtml_get_location(html);
387
474
if (location != NULL && strlen(location)) {
388
475
if (strlen(title))
389
ui_bookmarks_set_current_link(UIBOOKMARKS (chmsee->bookmark_tree), title, location);
476
ui_bookmarks_set_current_link(UIBOOKMARKS (selfp->bookmark_tree), title, location);
391
478
const gchar *book_title;
393
book_title = booktree_get_selected_book_title(BOOKTREE (chmsee->booktree));
394
ui_bookmarks_set_current_link(UIBOOKMARKS (chmsee->bookmark_tree), book_title, location);
480
book_title = booktree_get_selected_book_title(BOOKTREE (selfp->booktree));
481
ui_bookmarks_set_current_link(UIBOOKMARKS (selfp->bookmark_tree), book_title, location);
399
486
/* Popup html context menu */
401
html_context_normal_cb(Html *html, ChmSee *chmsee)
488
html_context_normal_cb(ChmseeIhtml *html, ChmSee *chmsee)
707
hpanes_toggled_cb(GtkToggleToolButton *widget, ChmSee *chmsee)
784
hpanes_toggled_cb(GtkToggleToolButton *widget, ChmSee *self)
710
GtkWidget *icon_widget;
711
GtkWidget *control_vbox;
713
787
g_object_get(widget, "active", &state, NULL);
714
g_debug("hpanes_toggled: %d", state);
716
control_vbox = get_widget(chmsee, "control_vbox");
719
icon_widget = gtk_image_new_from_file(CHMSEE_DATA_DIR"/hide-pane.png");
720
gtk_widget_show(control_vbox);
722
icon_widget = gtk_image_new_from_file(CHMSEE_DATA_DIR"/show-pane.png");
723
gtk_widget_hide(control_vbox);
726
reload_current_page(chmsee);
727
gtk_widget_show(icon_widget);
728
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON (widget), icon_widget);
788
set_sidepane_state(self, state);
732
on_open_new_tab(GtkWidget *widget, ChmSee *chmsee)
792
on_open_new_tab(GtkWidget *widget, ChmSee *self)
795
const gchar *location;
737
797
g_message("Open new tab");
739
g_return_if_fail(GTK_IS_NOTEBOOK (chmsee->html_notebook));
741
html = get_active_html(chmsee);
742
location = html_get_location(html);
744
if (location != NULL)
745
new_tab(chmsee, location);
799
g_return_if_fail(GTK_IS_NOTEBOOK (selfp->html_notebook));
801
html = get_active_html(self);
802
location = chmsee_ihtml_get_location(html);
804
if (location != NULL) {
805
new_tab(self, location);
751
on_close_current_tab(GtkWidget *widget, ChmSee *chmsee)
810
on_close_current_tab(GtkWidget *widget, ChmSee *self)
753
g_return_if_fail(GTK_IS_NOTEBOOK (chmsee->html_notebook));
812
g_return_if_fail(GTK_IS_NOTEBOOK (selfp->html_notebook));
755
if (gtk_notebook_get_n_pages(GTK_NOTEBOOK (chmsee->html_notebook)) == 1)
756
return chmsee_quit(chmsee);
814
if (gtk_notebook_get_n_pages(GTK_NOTEBOOK (selfp->html_notebook)) == 1)
815
return chmsee_quit(self);
760
page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK (chmsee->html_notebook));
819
page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK (selfp->html_notebook));
762
821
if (page_num >= 0)
763
gtk_notebook_remove_page(GTK_NOTEBOOK (chmsee->html_notebook), page_num);
822
gtk_notebook_remove_page(GTK_NOTEBOOK (selfp->html_notebook), page_num);
916
972
GDK_CONTROL_MASK,
917
973
GTK_ACCEL_VISIBLE);
919
menu_item = get_widget(chmsee, "menu_home");
975
menu_item = get_widget(self, "menu_home");
920
976
g_signal_connect(G_OBJECT (menu_item),
922
978
G_CALLBACK (on_home),
924
980
gtk_widget_set_sensitive(menu_item, FALSE);
926
menu_item = get_widget(chmsee, "menu_back");
982
menu_item = get_widget(self, "menu_back");
927
983
g_signal_connect(G_OBJECT (menu_item),
929
985
G_CALLBACK (on_back),
931
987
gtk_widget_set_sensitive(menu_item, FALSE);
933
menu_item = get_widget(chmsee, "menu_forward");
989
menu_item = get_widget(self, "menu_forward");
934
990
g_signal_connect(G_OBJECT (menu_item),
936
992
G_CALLBACK (on_forward),
938
994
gtk_widget_set_sensitive(menu_item, FALSE);
940
menu_item = get_widget(chmsee, "menu_about");
996
menu_item = get_widget(self, "menu_fullscreen");
997
g_signal_connect_swapped(G_OBJECT(menu_item),
999
G_CALLBACK(on_fullscreen_toggled),
1001
gtk_widget_add_accelerator(menu_item,
1008
menu_item = get_widget(self, "menu_sidepane");
1009
g_signal_connect_swapped(G_OBJECT(menu_item),
1011
G_CALLBACK(on_sidepane_toggled),
1013
gtk_widget_add_accelerator(menu_item,
1020
menu_item = get_widget(self, "menu_about");
941
1021
g_signal_connect(G_OBJECT (menu_item),
943
1023
G_CALLBACK (on_about),
946
1026
/* toolbar buttons */
947
1027
GtkWidget *toolbar_button;
948
1028
GtkWidget *icon_widget;
950
toolbar_button = get_widget(chmsee, "toolbar_open");
1030
toolbar_button = get_widget(self, "toolbar_open");
951
1031
g_signal_connect(G_OBJECT (toolbar_button),
953
1033
G_CALLBACK (on_open),
956
toolbar_button = get_widget(chmsee, "toolbar_setup");
1036
toolbar_button = get_widget(self, "toolbar_setup");
957
1037
g_signal_connect(G_OBJECT (toolbar_button),
959
1039
G_CALLBACK (on_setup),
962
toolbar_button = get_widget(chmsee, "toolbar_about");
1042
toolbar_button = get_widget(self, "toolbar_about");
963
1043
g_signal_connect(G_OBJECT (toolbar_button),
965
1045
G_CALLBACK (on_about),
968
toolbar_button = get_widget(chmsee, "toolbar_hpanes");
969
icon_widget = gtk_image_new_from_file(CHMSEE_DATA_DIR"/show-pane.png");
1048
toolbar_button = get_widget(self, "toolbar_hpanes");
1049
icon_widget = gtk_image_new_from_file(get_resource_path("show-pane.png"));
970
1050
gtk_widget_show(icon_widget);
971
1051
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON (toolbar_button), icon_widget);
972
1052
g_object_set(toolbar_button, "active", FALSE, NULL);
1046
1126
GtkWidget *control_vbox;
1048
control_vbox = get_widget(chmsee, "control_vbox");
1128
control_vbox = get_widget(self, "control_vbox");
1049
1129
gtk_widget_hide(control_vbox);
1051
1131
/* status bar */
1052
chmsee->statusbar = glade_xml_get_widget(glade, "statusbar1");
1053
chmsee->scid_default = gtk_statusbar_get_context_id(GTK_STATUSBAR (chmsee->statusbar),
1132
selfp->statusbar = glade_xml_get_widget(glade, "statusbar");
1133
selfp->scid_default = gtk_statusbar_get_context_id(GTK_STATUSBAR (selfp->statusbar),
1055
update_status_bar(chmsee, _("Ready!"));
1059
display_book(ChmSee *chmsee, ChmFile *book)
1062
GList *bookmarks_list;
1064
GtkWidget *booktree_sw;
1065
GtkWidget *control_vbox;
1067
g_message("display book");
1069
/* Close currently opened book */
1071
close_current_book(chmsee);
1073
chmsee->book = book;
1075
control_vbox = get_widget(chmsee, "control_vbox");
1077
/* Book contents TreeView widget */
1078
chmsee->control_notebook = gtk_notebook_new();
1080
gtk_box_pack_start(GTK_BOX (control_vbox),
1081
GTK_WIDGET (chmsee->control_notebook),
1085
g_signal_connect(G_OBJECT (chmsee->control_notebook),
1087
G_CALLBACK (control_switch_page_cb),
1091
if (chmsee->book->link_tree != NULL) {
1092
link_tree = chmsee->book->link_tree;
1094
booktree_sw = gtk_scrolled_window_new(NULL, NULL);
1095
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (booktree_sw),
1097
GTK_POLICY_AUTOMATIC);
1098
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (booktree_sw),
1100
gtk_container_set_border_width(GTK_CONTAINER (booktree_sw), 2);
1102
chmsee->booktree = GTK_WIDGET (booktree_new(link_tree));
1104
gtk_container_add(GTK_CONTAINER (booktree_sw), chmsee->booktree);
1105
gtk_notebook_append_page(GTK_NOTEBOOK (chmsee->control_notebook),
1107
gtk_label_new(_("Topics")));
1109
g_signal_connect(G_OBJECT (chmsee->booktree),
1111
G_CALLBACK (booktree_link_selected_cb),
1114
g_message("chmsee has toc");
1115
chmsee->has_toc = TRUE;
1119
bookmarks_list = chmsee->book->bookmarks_list;
1120
chmsee->bookmark_tree = GTK_WIDGET (ui_bookmarks_new(bookmarks_list));
1122
gtk_notebook_append_page(GTK_NOTEBOOK (chmsee->control_notebook),
1123
chmsee->bookmark_tree,
1124
gtk_label_new (_("Bookmarks")));
1126
g_signal_connect(G_OBJECT (chmsee->bookmark_tree),
1128
G_CALLBACK (bookmarks_link_selected_cb),
1133
hpaned = get_widget(chmsee, "hpaned1");
1135
/* HTML tabs notebook */
1136
chmsee->html_notebook = gtk_notebook_new();
1137
gtk_paned_add2 (GTK_PANED (hpaned), chmsee->html_notebook);
1139
g_signal_connect(G_OBJECT (chmsee->html_notebook),
1141
G_CALLBACK (html_switch_page_cb),
1144
gtk_widget_show_all(hpaned);
1145
new_tab(chmsee, NULL);
1147
gtk_notebook_set_current_page(GTK_NOTEBOOK (chmsee->control_notebook),
1148
g_list_length(bookmarks_list) && chmsee->has_toc ? 1 : 0);
1150
/* Toolbar buttons state */
1151
GtkWidget *toolbar_button;
1153
toolbar_button = get_widget(chmsee, "toolbar_hpanes");
1154
gtk_widget_set_sensitive(toolbar_button, TRUE);
1155
g_object_set(toolbar_button, "active", TRUE, NULL);
1157
toolbar_button = get_widget(chmsee, "toolbar_zoom_in");
1158
gtk_widget_set_sensitive(toolbar_button, TRUE);
1159
toolbar_button = get_widget(chmsee, "toolbar_zoom_reset");
1160
gtk_widget_set_sensitive(toolbar_button, TRUE);
1161
toolbar_button = get_widget(chmsee, "toolbar_zoom_out");
1162
gtk_widget_set_sensitive(toolbar_button, TRUE);
1164
if (chmsee->book->home) {
1165
GtkWidget *menu_item;
1167
open_homepage(chmsee);
1169
menu_item = get_widget(chmsee, "menu_new_tab");
1170
gtk_widget_set_sensitive(menu_item, TRUE);
1172
menu_item = get_widget(chmsee, "menu_close_tab");
1173
gtk_widget_set_sensitive(menu_item, TRUE);
1175
menu_item = get_widget(chmsee, "menu_home");
1176
gtk_widget_set_sensitive(menu_item, TRUE);
1178
toolbar_button = get_widget(chmsee, "toolbar_home");
1179
gtk_widget_set_sensitive(toolbar_button, TRUE);
1183
gchar *window_title;
1185
if (chmsee->book->title != NULL && g_ascii_strcasecmp(chmsee->book->title, "(null)") != 0 )
1186
window_title = g_strdup_printf("%s - ChmSee", chmsee->book->title);
1188
window_title = g_strdup("ChmSee");
1190
gtk_window_set_title(GTK_WINDOW (chmsee), window_title);
1191
g_free(window_title);
1193
html_set_variable_font(get_active_html(chmsee), chmsee->book->variable_font);
1194
html_set_fixed_font(get_active_html(chmsee), chmsee->book->fixed_font);
1198
close_current_book(ChmSee *chmsee)
1200
gchar* bookmark_fname = g_build_filename(chmsee->book->dir, BOOKMARK_FILE, NULL);
1201
bookmarks_save(ui_bookmarks_get_list(UIBOOKMARKS (chmsee->bookmark_tree)), bookmark_fname);
1135
update_status_bar(self, _("Ready!"));
1139
display_book(ChmSee* self, ChmseeIchmfile *book)
1142
GList *bookmarks_list;
1144
GtkWidget *booktree_sw;
1145
GtkWidget *control_vbox;
1147
g_debug("display book");
1149
/* Close currently opened book */
1151
close_current_book(self);
1155
control_vbox = get_widget(self, "control_vbox");
1157
/* Book contents TreeView widget */
1158
selfp->control_notebook = gtk_notebook_new();
1160
gtk_box_pack_start(GTK_BOX (control_vbox),
1161
GTK_WIDGET (selfp->control_notebook),
1165
g_signal_connect(G_OBJECT (selfp->control_notebook),
1167
G_CALLBACK (control_switch_page_cb),
1171
if (chmsee_ichmfile_get_link_tree(selfp->book) != NULL) {
1172
link_tree = chmsee_ichmfile_get_link_tree(selfp->book);
1174
booktree_sw = gtk_scrolled_window_new(NULL, NULL);
1175
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (booktree_sw),
1177
GTK_POLICY_AUTOMATIC);
1178
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (booktree_sw),
1180
gtk_container_set_border_width(GTK_CONTAINER (booktree_sw), 2);
1182
selfp->booktree = GTK_WIDGET(g_object_ref_sink(booktree_new(link_tree)));
1183
g_signal_connect_swapped(selfp->booktree,
1185
G_CALLBACK(on_scroll_event),
1188
gtk_container_add(GTK_CONTAINER (booktree_sw), selfp->booktree);
1189
gtk_notebook_append_page(GTK_NOTEBOOK (selfp->control_notebook),
1191
gtk_label_new(_("Topics")));
1193
g_signal_connect(G_OBJECT (selfp->booktree),
1195
G_CALLBACK (booktree_link_selected_cb),
1198
g_debug("chmsee has toc");
1199
selfp->has_toc = TRUE;
1203
bookmarks_list = chmsee_ichmfile_get_bookmarks_list(selfp->book);
1204
selfp->bookmark_tree = GTK_WIDGET (ui_bookmarks_new(bookmarks_list));
1206
gtk_notebook_append_page(GTK_NOTEBOOK (selfp->control_notebook),
1207
selfp->bookmark_tree,
1208
gtk_label_new (_("Bookmarks")));
1210
g_signal_connect(G_OBJECT (selfp->bookmark_tree),
1212
G_CALLBACK (bookmarks_link_selected_cb),
1217
hpaned = get_widget(self, "hpaned1");
1219
/* HTML tabs notebook */
1220
selfp->html_notebook = gtk_notebook_new();
1221
gtk_paned_add2 (GTK_PANED (hpaned), selfp->html_notebook);
1223
g_signal_connect(G_OBJECT (selfp->html_notebook),
1225
G_CALLBACK (html_switch_page_cb),
1228
gtk_widget_show_all(hpaned);
1229
new_tab(self, NULL);
1231
gtk_notebook_set_current_page(GTK_NOTEBOOK (selfp->control_notebook),
1232
g_list_length(bookmarks_list) && selfp->has_toc ? 1 : 0);
1234
/* Toolbar buttons state */
1235
GtkWidget *toolbar_button;
1237
toolbar_button = get_widget(self, "toolbar_hpanes");
1238
gtk_widget_set_sensitive(toolbar_button, TRUE);
1239
g_object_set(toolbar_button, "active", TRUE, NULL);
1241
toolbar_button = get_widget(self, "toolbar_zoom_in");
1242
gtk_widget_set_sensitive(toolbar_button, TRUE);
1243
toolbar_button = get_widget(self, "toolbar_zoom_reset");
1244
gtk_widget_set_sensitive(toolbar_button, TRUE);
1245
toolbar_button = get_widget(self, "toolbar_zoom_out");
1246
gtk_widget_set_sensitive(toolbar_button, TRUE);
1248
if (chmsee_ichmfile_get_home(selfp->book)) {
1249
GtkWidget *menu_item;
1251
open_homepage(self);
1253
menu_item = get_widget(self, "menu_new_tab");
1254
gtk_widget_set_sensitive(menu_item, TRUE);
1256
menu_item = get_widget(self, "menu_close_tab");
1257
gtk_widget_set_sensitive(menu_item, TRUE);
1259
menu_item = get_widget(self, "menu_home");
1260
gtk_widget_set_sensitive(menu_item, TRUE);
1262
gtk_widget_set_sensitive(get_widget(self, "menu_sidepane"), TRUE);
1264
toolbar_button = get_widget(self, "toolbar_home");
1265
gtk_widget_set_sensitive(toolbar_button, TRUE);
1269
gchar *window_title;
1271
if (chmsee_ichmfile_get_title(selfp->book) != NULL
1272
&& g_ascii_strcasecmp(chmsee_ichmfile_get_title(selfp->book), "(null)") != 0 ) {
1273
window_title = g_strdup_printf("%s - ChmSee", chmsee_ichmfile_get_title(selfp->book));
1275
window_title = g_strdup("ChmSee");
1278
gtk_window_set_title(GTK_WINDOW (self), window_title);
1279
g_free(window_title);
1281
chmsee_ihtml_set_variable_font(get_active_html(self),
1282
chmsee_ichmfile_get_variable_font(selfp->book));
1283
chmsee_ihtml_set_fixed_font(get_active_html(self),
1284
chmsee_ichmfile_get_fixed_font(selfp->book));
1288
close_current_book(ChmSee *self)
1290
gchar* bookmark_fname = g_build_filename(chmsee_ichmfile_get_dir(selfp->book), CHMSEE_BOOKMARK_FILE, NULL);
1291
bookmarks_save(ui_bookmarks_get_list(UIBOOKMARKS (selfp->bookmark_tree)), bookmark_fname);
1202
1292
g_free(bookmark_fname);
1203
g_object_unref(chmsee->book);
1204
gtk_widget_destroy(GTK_WIDGET (chmsee->control_notebook));
1205
gtk_widget_destroy(GTK_WIDGET (chmsee->html_notebook));
1293
g_object_unref(selfp->book);
1294
gtk_widget_destroy(GTK_WIDGET (selfp->control_notebook));
1295
gtk_widget_destroy(GTK_WIDGET (selfp->html_notebook));
1298
selfp->control_notebook = NULL;
1299
selfp->html_notebook = NULL;
1208
1302
static GtkWidget*
1311
1413
gtk_widget_realize(view);
1313
1415
if (location != NULL) {
1314
html_open_uri(html, location);
1316
if (chmsee->has_toc)
1317
booktree_select_uri(BOOKTREE (chmsee->booktree), location);
1321
gtk_notebook_set_current_page(GTK_NOTEBOOK (chmsee->html_notebook), num);
1325
open_homepage(ChmSee *chmsee)
1329
html = get_active_html(chmsee);
1331
g_signal_handlers_block_by_func(html, html_open_uri_cb, chmsee);
1333
html_open_uri(html, g_build_filename(chmsee->book->dir, chmsee->book->home, NULL));
1335
g_signal_handlers_unblock_by_func(html, html_open_uri_cb, chmsee);
1337
if (chmsee->has_toc)
1338
booktree_select_uri(BOOKTREE (chmsee->booktree), chmsee->book->home);
1340
check_history(chmsee, html);
1344
reload_current_page(ChmSee *chmsee)
1416
chmsee_ihtml_open_uri(html, location);
1419
booktree_select_uri(BOOKTREE (selfp->booktree), location);
1421
chmsee_ihtml_clear(html);
1424
gtk_notebook_set_current_page(GTK_NOTEBOOK (selfp->html_notebook), num);
1428
open_homepage(ChmSee *self)
1432
html = get_active_html(self);
1434
g_signal_handlers_block_by_func(html, html_open_uri_cb, self);
1436
chmsee_ihtml_open_uri(html, g_build_filename(chmsee_ichmfile_get_dir(selfp->book),
1437
chmsee_ichmfile_get_home(selfp->book), NULL));
1439
g_signal_handlers_unblock_by_func(html, html_open_uri_cb, self);
1441
if (selfp->has_toc) {
1442
booktree_select_uri(BOOKTREE (selfp->booktree),
1443
chmsee_ichmfile_get_home(selfp->book));
1446
check_history(self, html);
1450
reload_current_page(ChmSee *self)
1453
const gchar *location;
1349
1455
g_message("Reload current page");
1351
g_return_if_fail(GTK_IS_NOTEBOOK (chmsee->html_notebook));
1353
html = get_active_html(chmsee);
1354
location = html_get_location(html);
1356
if (location != NULL)
1357
html_open_uri(html, location);
1457
g_return_if_fail(GTK_IS_NOTEBOOK (selfp->html_notebook));
1459
html = get_active_html(self);
1460
location = chmsee_ihtml_get_location(html);
1462
if (location != NULL) {
1463
chmsee_ihtml_open_uri(html, location);
1363
get_active_html(ChmSee *chmsee)
1467
static ChmseeIhtml *
1468
get_active_html(ChmSee *self)
1365
1470
GtkWidget *frame;
1368
page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK (chmsee->html_notebook));
1473
if(!selfp->html_notebook) {
1476
page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK (selfp->html_notebook));
1370
1478
if (page_num == -1)
1373
frame = gtk_notebook_get_nth_page(GTK_NOTEBOOK (chmsee->html_notebook), page_num);
1481
frame = gtk_notebook_get_nth_page(GTK_NOTEBOOK (selfp->html_notebook), page_num);
1375
1483
return g_object_get_data(G_OBJECT (frame), "html");
1379
check_history(ChmSee *chmsee, Html *html)
1487
check_history(ChmSee *chmsee, ChmseeIhtml *html)
1381
1489
GtkWidget *menu_item, *toolbar_button;
1382
1490
gboolean back_state, forward_state;
1384
back_state = html_can_go_back(html);
1385
forward_state = html_can_go_forward(html);
1492
back_state = chmsee_ihtml_can_go_back(html);
1493
forward_state = chmsee_ihtml_can_go_forward(html);
1387
1495
menu_item = get_widget(chmsee, "menu_back");
1388
1496
gtk_widget_set_sensitive(menu_item, back_state);
1472
1578
/* external functions */
1581
chmsee_new(const gchar* filename)
1479
chmsee = g_object_new(TYPE_CHMSEE, NULL);
1585
self = g_object_new(TYPE_CHMSEE, NULL);
1481
1587
/* Quit event handle */
1482
g_signal_connect(G_OBJECT (chmsee),
1588
g_signal_connect(G_OBJECT (self),
1483
1589
"delete_event",
1484
1590
G_CALLBACK (delete_cb),
1486
g_signal_connect(G_OBJECT (chmsee),
1592
g_signal_connect(G_OBJECT (self),
1488
1594
G_CALLBACK (destroy_cb),
1491
1597
/* Widget size changed event handle */
1492
g_signal_connect(G_OBJECT (chmsee),
1598
g_signal_connect(G_OBJECT (self),
1493
1599
"configure-event",
1494
G_CALLBACK (configure_event_cb),
1497
load_chmsee_config(chmsee);
1600
G_CALLBACK (on_configure_event),
1499
1603
/* Init gecko */
1501
html_set_default_lang(chmsee->lang);
1503
window_populate(chmsee);
1505
if (chmsee->pos_x >= 0 && chmsee->pos_y >= 0)
1506
gtk_window_move(GTK_WINDOW (chmsee), chmsee->pos_x, chmsee->pos_y);
1508
if (chmsee->width > 0 && chmsee->height > 0)
1509
gtk_window_resize(GTK_WINDOW (chmsee), chmsee->width, chmsee->height);
1604
chmsee_html_init_system();
1605
chmsee_html_set_default_lang(selfp->lang);
1607
populate_window(self);
1608
chmsee_load_config(self);
1609
if (selfp->pos_x >= 0 && selfp->pos_y >= 0)
1610
gtk_window_move(GTK_WINDOW (self), selfp->pos_x, selfp->pos_y);
1612
if (selfp->width > 0 && selfp->height > 0)
1613
gtk_window_resize(GTK_WINDOW (self), selfp->width, selfp->height);
1511
gtk_window_resize(GTK_WINDOW (chmsee), 800, 600);
1513
gtk_window_set_title(GTK_WINDOW (chmsee), "ChmSee");
1514
gtk_window_set_icon_from_file(GTK_WINDOW (chmsee), CHMSEE_DATA_DIR"/chmsee-icon.png", NULL);
1615
gtk_window_resize(GTK_WINDOW (self), 800, 600);
1617
gtk_window_set_title(GTK_WINDOW (self), "ChmSee");
1618
gtk_window_set_icon_from_file(GTK_WINDOW (self), get_resource_path("chmsee-icon.png"), NULL);
1620
if(filename != NULL) {
1621
chmsee_open_file(self, filename);
1520
chmsee_open_file(ChmSee *chmsee, const gchar *filename)
1628
chmsee_open_file(ChmSee *self, const gchar *filename)
1630
ChmseeIchmfile* book;
1524
g_return_if_fail(IS_CHMSEE (chmsee));
1632
g_return_if_fail(IS_CHMSEE (self));
1526
1634
/* Extract chm and get file infomation */
1527
book = chmfile_new(filename);
1635
book = chmsee_chmfile_new(filename);
1530
display_book(chmsee, book);
1638
display_book(self, book);
1532
chmsee->last_dir = g_strdup_printf("%s", g_path_get_dirname(filename));
1640
selfp->last_dir = g_strdup_printf("%s", g_path_get_dirname(filename));
1534
1642
/* Popup an error message dialog */
1535
1643
GtkWidget *msg_dialog;
1537
msg_dialog = gtk_message_dialog_new(GTK_WINDOW (chmsee),
1645
msg_dialog = gtk_message_dialog_new(GTK_WINDOW (self),
1538
1646
GTK_DIALOG_DESTROY_WITH_PARENT,
1539
1647
GTK_MESSAGE_ERROR,
1540
1648
GTK_BUTTONS_CLOSE,
1587
1695
chmsee_open_file(chmsee, fname);
1699
int chmsee_get_hpaned_position(ChmSee* self) {
1701
g_object_get(G_OBJECT(get_widget(self, "hpaned1")),
1702
"position", &position,
1708
void chmsee_set_hpaned_position(ChmSee* self, int hpaned_position) {
1709
selfp->hpaned_position = hpaned_position;
1711
g_object_set(G_OBJECT(get_widget(self, "hpaned1")),
1712
"position", hpaned_position,
1718
void on_fullscreen_toggled(ChmSee* self, GtkWidget* menu) {
1719
g_return_if_fail(IS_CHMSEE(self));
1721
g_object_get(G_OBJECT(menu),
1724
chmsee_set_fullscreen(self, active);
1727
void on_sidepane_toggled(ChmSee* self, GtkWidget* menu) {
1728
g_return_if_fail(IS_CHMSEE(self));
1730
g_object_get(G_OBJECT(menu),
1734
show_sidepane(self);
1736
hide_sidepane(self);
1740
void set_sidepane_state(ChmSee* self, gboolean state) {
1741
GtkWidget* icon_widget;
1744
gtk_widget_show(get_widget(self, "control_vbox"));
1746
gtk_widget_hide(get_widget(self, "control_vbox"));
1749
gboolean menu_state = gtk_check_menu_item_get_active(
1750
GTK_CHECK_MENU_ITEM(get_widget(self, "menu_sidepane")));
1751
if(menu_state != state) {
1752
gtk_check_menu_item_set_active(
1753
GTK_CHECK_MENU_ITEM(get_widget(self, "menu_sidepane")), state);
1756
gboolean toolbar_state = gtk_toggle_tool_button_get_active(
1757
GTK_TOGGLE_TOOL_BUTTON(get_widget(self, "toolbar_hpanes")));
1758
if(toolbar_state != state) {
1759
gtk_toggle_tool_button_set_active(
1760
GTK_TOGGLE_TOOL_BUTTON(get_widget(self, "toolbar_hpanes")), state);
1764
icon_widget = gtk_image_new_from_file(get_resource_path("hide-pane.png"));
1766
icon_widget = gtk_image_new_from_file(get_resource_path("show-pane.png"));
1768
gtk_widget_show(icon_widget);
1769
gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON (get_widget(self, "toolbar_hpanes")), icon_widget);
1772
void show_sidepane(ChmSee* self) {
1773
set_sidepane_state(self, TRUE);
1776
void hide_sidepane(ChmSee* self) {
1777
set_sidepane_state(self, FALSE);
1781
void on_map(ChmSee* self) {
1782
if(selfp->hpaned_position >= 0) {
1783
g_object_set(G_OBJECT(get_widget(self, "hpaned1")),
1784
"position", selfp->hpaned_position,
1791
static void on_fullscreen(ChmSee* self) {
1792
gtk_widget_hide(get_widget(self, "handlebox_menu"));
1793
gtk_widget_hide(get_widget(self, "handlebox_toolbar"));
1794
gtk_widget_hide(get_widget(self, "statusbar"));
1795
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(get_widget(self, "menu_fullscreen")),
1797
selfp->fullscreen = TRUE;
1800
static void on_unfullscreen(ChmSee* self) {
1801
gtk_widget_show(get_widget(self, "handlebox_menu"));
1802
gtk_widget_show(get_widget(self, "handlebox_toolbar"));
1803
gtk_widget_show(get_widget(self, "statusbar"));
1804
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(get_widget(self, "menu_fullscreen")),
1806
selfp->fullscreen = FALSE;
1809
gboolean on_window_state_event(ChmSee* self, GdkEventWindowState* event) {
1810
g_return_val_if_fail(IS_CHMSEE(self), FALSE);
1811
g_return_val_if_fail(event->type == GDK_WINDOW_STATE, FALSE);
1813
if(!(event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)) {
1817
if(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) {
1818
on_fullscreen(self);
1820
on_unfullscreen(self);
1826
static gboolean on_scroll_event(ChmSee* self, GdkEventScroll* event) {
1827
if(event->direction == GDK_SCROLL_UP && (event->state & GDK_CONTROL_MASK)) {
1828
on_zoom_in(NULL, self);
1830
} else if(event->direction == GDK_SCROLL_DOWN && (event->state & GDK_CONTROL_MASK)) {
1831
on_zoom_out(NULL, self);
1834
g_debug("event->direction: %d", event->direction);
1835
g_debug("event->state: %x", event->state);
1841
const gchar* chmsee_get_cache_dir(ChmSee* self) {
1842
return selfp->cache_dir;
1845
const gchar* chmsee_get_variable_font(ChmSee* self) {
1846
g_return_val_if_fail(selfp->book, NULL);
1847
return chmsee_ichmfile_get_variable_font(selfp->book);
1850
void chmsee_set_variable_font(ChmSee* self, const gchar* font_name) {
1851
g_return_if_fail(selfp->book);
1852
chmsee_ichmfile_set_variable_font(selfp->book, font_name);
1855
const gchar* chmsee_get_fixed_font(ChmSee* self) {
1856
g_return_val_if_fail(selfp->book, NULL);
1857
return chmsee_ichmfile_get_fixed_font(selfp->book);
1860
void chmsee_set_fixed_font(ChmSee* self, const gchar* font_name) {
1861
g_return_if_fail(selfp->book);
1862
chmsee_ichmfile_set_fixed_font(selfp->book, font_name);
1865
int chmsee_get_lang(ChmSee* self) {
1868
void chmsee_set_lang(ChmSee* self, int lang) {
1872
gboolean chmsee_has_book(ChmSee* self) {
1873
return selfp->book != NULL;
1877
chmsee_load_config(ChmSee *self)
1879
GList *pairs, *list;
1882
path = g_build_filename(selfp->home, "config", NULL);
1884
g_debug("config path = %s", path);
1886
pairs = parse_config_file("config", path);
1888
for (list = pairs; list; list = list->next) {
1893
/* Get user prefered language */
1894
if (strstr(item->id, "LANG")) {
1895
selfp->lang = atoi(item->value);
1899
/* Get last directory */
1900
if (strstr(item->id, "LAST_DIR")) {
1901
selfp->last_dir = g_strdup(item->value);
1905
/* Get window position */
1906
if (strstr(item->id, "POS_X")) {
1907
selfp->pos_x = atoi(item->value);
1910
if (strstr(item->id, "POS_Y")) {
1911
selfp->pos_y = atoi(item->value);
1914
if (strstr(item->id, "WIDTH")) {
1915
selfp->width = atoi(item->value);
1918
if (strstr(item->id, "HEIGHT")) {
1919
selfp->height = atoi(item->value);
1922
if(strstr(item->id, "HPANED_POSTION")) {
1923
chmsee_set_hpaned_position(self, atoi(item->value));
1926
if(strstr(item->id, "FULLSCREEN")) {
1927
if(strcmp(item->value, "true") == 0) {
1928
chmsee_set_fullscreen(self, TRUE);
1929
} else if(strcmp(item->value, "false") == 0) {
1930
chmsee_set_fullscreen(self, FALSE);
1932
g_warning("%s:%d:unknown value of FULLSCREEN %s", __FILE__, __LINE__, item->value);
1937
free_config_list(pairs);
1942
chmsee_save_config(ChmSee *self)
1947
path = g_build_filename(selfp->home, "config", NULL);
1949
file = fopen(path, "w");
1952
g_print("Faild to open chmsee config: %s", path);
1956
save_option(file, "LANG", g_strdup_printf("%d", selfp->lang));
1957
save_option(file, "LAST_DIR", selfp->last_dir);
1958
save_option(file, "POS_X", g_strdup_printf("%d", selfp->pos_x));
1959
save_option(file, "POS_Y", g_strdup_printf("%d", selfp->pos_y));
1960
save_option(file, "WIDTH", g_strdup_printf("%d", selfp->width));
1961
save_option(file, "HEIGHT", g_strdup_printf("%d", selfp->height));
1962
save_option(file, "HPANED_POSTION", g_strdup_printf("%d", chmsee_get_hpaned_position(self)));
1963
save_option(file, "FULLSCREEN", selfp->fullscreen ? "true" : "false" );
1969
void chmsee_set_fullscreen(ChmSee* self, gboolean fullscreen) {
1970
if(fullscreen == selfp->fullscreen) {
1975
gtk_window_fullscreen(GTK_WINDOW(self));
1977
gtk_window_unfullscreen(GTK_WINDOW(self));