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