1 #include "reader_book_chunks.h"
2
3 void text_tag_foreach_remove(GtkTextTag* tag, gpointer data);
4 void free_text_mark(gpointer ptr);
5
reader_close_book(APP * app)6 int reader_close_book(APP* app)
7 {
8 GtkWidget* main_wnd = app->main_wnd;
9 GtkTreeStore* section_treestore = app->sections_treestore;
10 GtkTextBuffer* text_buff = app->text_buff;
11 GHashTable* book_img_table = app->book_img_table;
12 GHashTable* book_id_table = app->book_id_table;
13 BOOK_TYPE book_type = app->book_type;
14 GList* book_jump_list = app->book_jump_list;
15 char* book_hash = app->book_hash;
16 char* book_name = app->book_title;
17
18 if(book_type != BOOK_TYPE_NONE)
19 {
20 reader_scroll_save(app);
21
22 GtkTextIter text_buff_end_iter;
23 GtkTextIter text_buff_start_iter;
24 GtkTextTagTable* text_tag_table = gtk_text_buffer_get_tag_table(text_buff);
25
26 gtk_text_buffer_get_bounds(text_buff, &text_buff_start_iter, &text_buff_end_iter);
27 gtk_text_buffer_delete(text_buff, &text_buff_start_iter, &text_buff_end_iter);
28
29 gtk_text_tag_table_foreach(text_tag_table, text_tag_foreach_remove, text_tag_table);
30
31 g_hash_table_destroy(book_img_table);
32 g_hash_table_destroy(book_id_table);
33
34 g_list_free_full(book_jump_list, free_text_mark);
35
36 gtk_window_set_title(GTK_WINDOW(main_wnd), "Simple FB2 reader");
37
38 gtk_tree_store_clear(section_treestore);
39
40 g_free(book_hash);
41 g_free(book_name);
42
43 app->book_jump_list = NULL;
44 app->book_hash = NULL;
45 app->book_title = NULL;
46 app->book_type = BOOK_TYPE_NONE;
47 app->book_index = -1;
48
49
50 return EXIT_SUCCESS;
51 }
52
53 return EXIT_FAILURE;
54 }
55
free_text_mark(gpointer ptr)56 void free_text_mark(gpointer ptr)
57 {
58 GtkTextMark* mark = GTK_TEXT_MARK(ptr);
59 GtkTextBuffer* text_buff = gtk_text_mark_get_buffer(mark);
60
61 gtk_text_buffer_delete_mark(text_buff, mark);
62 }
63
text_tag_foreach_remove(GtkTextTag * tag,gpointer data)64 void text_tag_foreach_remove(GtkTextTag* tag, gpointer data)
65 {
66 GtkTextTagTable* text_tag_table = (GtkTextTagTable*)data;
67
68 GValue tag_name = G_VALUE_INIT;
69 g_value_init(&tag_name, G_TYPE_STRING);
70 g_object_get_property(G_OBJECT(tag), "name", &tag_name);
71
72 if(g_value_get_string(&tag_name) == NULL)
73 gtk_text_tag_table_remove(text_tag_table, tag);
74
75 g_value_unset(&tag_name);
76 }
77