From 423af80ad421a8a19e1c4be0c6851dff845a0f6c Mon Sep 17 00:00:00 2001 From: rootavish Date: Thu, 10 Jul 2014 13:50:37 +0530 Subject: Files for EvWebView, thumbnails possible with GTK+-2.0 My last commit was supposed to have ev-web-view.c and ev-web-view.h however due to some reason I missed them last time, so here they are now. i am able to achieve thumbnails for my epub however these are of absurdly large size. Still struggling to get the webview done due to thread problems that I am encountering. --- libview/ev-web-view.c | 349 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 libview/ev-web-view.c (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c new file mode 100644 index 00000000..96fb6c46 --- /dev/null +++ b/libview/ev-web-view.c @@ -0,0 +1,349 @@ +/* this file is part of atril, a mate document viewer + * + * Copyright (C) 2014 Avishkar Gupta + * Based on ev-view.c + * + * Atril is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atril is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include +#include + +#if GTK_CHECK_VERSION (3, 0, 0) +#include +#else +#include +#endif +#include "ev-web-view.h" +#include "ev-document-model.h" +#define EV_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_WEB_VIEW, EvWebViewClass)) +#define EV_IS_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_WEB_VIEW)) +#define EV_WEB_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_WEB_VIEW, EvWebViewClass)) + +struct _EvWebView +{ + WebKitWebView web_view; + EvDocument *document; + EvDocumentModel *model; + gint current_page; + gboolean inverted_colors ; + gboolean fullscreen; +}; + +struct _EvWebViewClass +{ + WebKitWebViewClass base_class; +}; +G_DEFINE_TYPE (EvWebView, ev_web_view, WEBKIT_TYPE_WEB_VIEW) + +/*** Callbacks ***/ +static void ev_web_view_change_page (EvWebView *webview, + gint new_page); + +static void ev_web_view_page_changed_cb (EvDocumentModel *model, + gint old_page, + gint new_page, + EvWebView *webview); +/*** GObject ***/ + +#if GTK_CHECK_VERSION (3, 0, 0) +static void ev_view_dispose (GObject *object); +#else +static void ev_web_view_destroy (GtkObject *object); +#endif +static void ev_web_view_class_init (EvWebViewClass *klass); +static void ev_web_view_init (EvWebView *webview); + +static void +web_view_update_range_and_current_page (EvWebView *webview) +{ + g_return_if_fail(EV_IS_WEB_VIEW(webview)); + + if (ev_document_get_n_pages (webview->document) <= 0) + return; + + ev_document_model_set_page(webview->model, 0); + webview->current_page = 0; + EvPage *webpage = ev_document_get_page(webview->document,0); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webpage->backend_page); +} + +static void +#if GTK_CHECK_VERSION (3, 0, 0) +ev_web_view_dispose (GObject *object) +#else +ev_web_view_destroy (GtkObject *object) +#endif +{ + EvWebView *webview = EV_WEB_VIEW (object); + + if (webview->document) { + g_object_unref(webview->document); + webview->document = NULL ; + } + + if (webview->model) { + g_object_unref(webview->model); + webview->model = NULL; + } + WebKitWebViewClass *klass = WEBKIT_WEB_VIEW_GET_CLASS(webview); + +#if GTK_CHECK_VERSION (3, 0, 0) + G_OBJECT_CLASS (ev_web_view_parent_class)->dispose (object); +#else + GTK_OBJECT_CLASS (ev_web_view_parent_class)->destroy (object); +#endif +} + +static void +ev_web_view_class_init (EvWebViewClass *klass) +{ +} + +static void +ev_web_view_init (EvWebView *webview) +{ + gtk_widget_set_can_focus (GTK_WIDGET (webview), TRUE); +#if GTK_CHECK_VERSION (3, 0, 0) + gtk_widget_set_has_window (GTK_WIDGET (webview), TRUE); +#endif + + webview->current_page = 0; + + webview->fullscreen = FALSE; + +} + +/*** Callbacks ***/ + +static void +ev_web_view_change_page (EvWebView *webview, + gint new_page) +{ + g_return_if_fail(EV_IS_WEB_VIEW(webview)); + + EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS(webview->document); + EvPage *page = klass->get_page(webview->document,new_page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)page->backend_page); + + webview->current_page = new_page; +} + +static void +ev_web_view_page_changed_cb (EvDocumentModel *model, + gint old_page, + gint new_page, + EvWebView *webview) +{ + if (!webview->document) + return; + + if (webview->current_page != new_page) { + ev_web_view_change_page (webview, new_page); + } else { + webkit_web_view_reload (WEBKIT_WEB_VIEW(webview)); + } +} + +GtkWidget* +ev_web_view_new (void) +{ + GtkWidget *webview; + + webview = g_object_new (EV_TYPE_WEB_VIEW, NULL); + + return webview; +} + +static void +ev_web_view_document_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvWebView *webview) +{ + g_return_if_fail(EV_IS_WEB_VIEW(webview)); + + EvDocument *document = ev_document_model_get_document (model); + + if (document != webview->document) { + + if (webview->document ) + g_object_unref(webview->document); + + webview->document = document ; + + if(webview->document) { + g_object_ref(webview->document); + } + + gint current_page = ev_document_model_get_page(model); + if (webview->current_page != current_page) { + ev_web_view_change_page (webview, current_page); + } else { + webkit_web_view_reload (webview); + } + + } +} + +static void +ev_web_view_inverted_colors_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvWebView *webview) +{ + guint inverted_colors = ev_document_model_get_inverted_colors (model); + inverted_colors = !inverted_colors; + /*TODO*/ +} + +static void +ev_web_view_fullscreen_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, + EvWebView *webview) +{ + gboolean fullscreen = ev_document_model_get_fullscreen (model); + + webview->fullscreen = fullscreen; +#if GTK_CHECK_VERSION (3, 0, 0) + WebKitWindowProperties *window_properties = + webkit_web_view_get_window_properties (WEBKIT_WEB_VIEW(webview)); + + webkit_window_properties_get_fullscreen(window_properties); + /*TODO*/ +#else + webkit_web_view_set_view_mode(WEBKIT_WEB_VIEW(webview), WEBKIT_WEB_VIEW_VIEW_MODE_FULLSCREEN); +#endif +} + +void +ev_web_view_set_model (EvWebView *webview, + EvDocumentModel *model) +{ + g_return_if_fail (EV_IS_WEB_VIEW (webview)); + g_return_if_fail (EV_IS_DOCUMENT_MODEL (model)); + + if (model == webview->model) + return; + + if (webview->model) { + g_signal_handlers_disconnect_by_func (webview->model, + ev_web_view_document_changed_cb, + webview); + g_signal_handlers_disconnect_by_func (webview->model, + ev_web_view_page_changed_cb, + webview); + g_object_unref (webview->model); + } + webview->model = g_object_ref (model); + + /* Initialize webview from model */ + webview->fullscreen = ev_document_model_get_fullscreen (webview->model); + webview->inverted_colors = ev_document_model_get_inverted_colors(webview->model); + ev_web_view_document_changed_cb (webview->model, NULL, webview); + + g_signal_connect (webview->model, "notify::document", + G_CALLBACK (ev_web_view_document_changed_cb), + webview); + g_signal_connect (webview->model, "notify::inverted-colors", + G_CALLBACK (ev_web_view_inverted_colors_changed_cb), + webview); + g_signal_connect (webview->model,"page-changed", + G_CALLBACK(ev_web_view_page_changed_cb), + webview); +} + +void +ev_web_view_reload_page (EvWebView *webview, + gint page) +{ + webkit_web_view_reload (WEBKIT_WEB_VIEW(webview)); +} + +void +ev_web_view_reload (EvWebView *webview) +{ + web_view_update_range_and_current_page (webview); +} + + +gboolean +ev_web_view_next_page (EvWebView *webview) +{ + int page, n_pages; + + g_return_val_if_fail (EV_IS_WEB_VIEW (webview), FALSE); + + if (!webview->document) + return FALSE; + + page = ev_document_model_get_page (webview->model); + n_pages = ev_document_get_n_pages (webview->document); + + page = page + 1; + + if (page < n_pages) { + ev_document_model_set_page (webview->model, page); + return TRUE; + } else if (page == n_pages) { + ev_document_model_set_page (webview->model, page - 1); + return TRUE; + } else { + return FALSE; + } +} + +gboolean +ev_web_view_previous_page (EvWebView *webview) +{ + int page; + + g_return_val_if_fail (EV_IS_WEB_VIEW (webview), FALSE); + + if (!webview->document) + return FALSE; + + page = ev_document_model_get_page (webview->model); + + page = page - 1 ; + + if (page >= 0) { + ev_document_model_set_page (webview->model, page); + return TRUE; + } else if (page == -1) { + ev_document_model_set_page (webview->model, 0); + return TRUE; + } else { + return FALSE; + } +} + +void +ev_web_view_handle_link(EvWebView *webview,EvLink *link) +{ + +} + +void +ev_web_view_find_next(EvWebView *webview) +{ + +} + +void +ev_web_view_find_previous(EvWebView *webview) +{ + +} -- cgit v1.2.1 From 46fce038996fa84784df775d0b2e941228388b66 Mon Sep 17 00:00:00 2001 From: rootavish Date: Sat, 19 Jul 2014 10:47:43 +0530 Subject: Thumbnails for all documents Now other problems with webkit. After much fidgeting I was able to resolve the previous problems of threads. However, now there is a different webkit error. --- libview/ev-web-view.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 96fb6c46..b88d09ff 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -99,8 +99,7 @@ ev_web_view_destroy (GtkObject *object) if (webview->model) { g_object_unref(webview->model); webview->model = NULL; - } - WebKitWebViewClass *klass = WEBKIT_WEB_VIEW_GET_CLASS(webview); + }; #if GTK_CHECK_VERSION (3, 0, 0) G_OBJECT_CLASS (ev_web_view_parent_class)->dispose (object); @@ -193,7 +192,7 @@ ev_web_view_document_changed_cb (EvDocumentModel *model, if (webview->current_page != current_page) { ev_web_view_change_page (webview, current_page); } else { - webkit_web_view_reload (webview); + webkit_web_view_reload (WEBKIT_WEB_VIEW(webview)); } } @@ -227,7 +226,6 @@ ev_web_view_fullscreen_changed_cb (EvDocumentModel *model, webkit_web_view_set_view_mode(WEBKIT_WEB_VIEW(webview), WEBKIT_WEB_VIEW_VIEW_MODE_FULLSCREEN); #endif } - void ev_web_view_set_model (EvWebView *webview, EvDocumentModel *model) @@ -296,9 +294,13 @@ ev_web_view_next_page (EvWebView *webview) if (page < n_pages) { ev_document_model_set_page (webview->model, page); + EvPage *webpage = ev_document_get_page(webview->document,page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webpage->backend_page); return TRUE; } else if (page == n_pages) { ev_document_model_set_page (webview->model, page - 1); + EvPage *webpage = ev_document_get_page(webview->document,page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webpage->backend_page); return TRUE; } else { return FALSE; @@ -321,9 +323,13 @@ ev_web_view_previous_page (EvWebView *webview) if (page >= 0) { ev_document_model_set_page (webview->model, page); + EvPage *webpage = ev_document_get_page(webview->document,page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webpage->backend_page); return TRUE; } else if (page == -1) { ev_document_model_set_page (webview->model, 0); + EvPage *webpage = ev_document_get_page(webview->document,page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webpage->backend_page); return TRUE; } else { return FALSE; -- cgit v1.2.1 From 4a3ac19d1365cb87a31eecea4759484673fad667 Mon Sep 17 00:00:00 2001 From: rootavish Date: Sun, 20 Jul 2014 16:08:07 +0530 Subject: Active properties dialog, other actions Properties dialog for epub documents, will some basic properties. Also set toolbar and menu sensitivity for the actions available in epub, will add more(find) once I write the module. Also inverted colors needs to be done with CSS or the like. --- libview/ev-web-view.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index b88d09ff..136e1e96 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -353,3 +353,9 @@ ev_web_view_find_previous(EvWebView *webview) { } + +gboolean +ev_web_view_get_has_selection(EvWebView *webview) +{ + return webkit_web_view_has_selection(WEBKIT_WEB_VIEW(webview)); +} \ No newline at end of file -- cgit v1.2.1 From b219a4a96ed7f38bf3de46bff790b139955bd927 Mon Sep 17 00:00:00 2001 From: rootavish Date: Wed, 23 Jul 2014 00:18:47 +0530 Subject: Cleaned some code, added select-all functionality Select all functionality to select all content from the webview. Cleaned ev-jobs.c, it had a lot of unused code. --- libview/ev-web-view.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 136e1e96..fbfbad02 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -358,4 +358,10 @@ gboolean ev_web_view_get_has_selection(EvWebView *webview) { return webkit_web_view_has_selection(WEBKIT_WEB_VIEW(webview)); +} + +void +ev_web_view_select_all(EvWebView *webview) +{ + webkit_web_view_select_all(WEBKIT_WEB_VIEW(webview)); } \ No newline at end of file -- cgit v1.2.1 From df1fce63dca7bd7ac85c720a357adba0f1b7108a Mon Sep 17 00:00:00 2001 From: rootavish Date: Wed, 23 Jul 2014 22:19:20 +0530 Subject: Added Zoom control, Window thubnail Added zoom-in and zoom out capabilities, also re-enabled window thumbnail which I had disabled previously when the thumbnails were not implemented. Still trying to get the document to display, need to make the right changes, also trying to stop the window from entering presentation view, but that does happen and needs to be fixed. --- libview/ev-web-view.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index fbfbad02..aa31751d 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -364,4 +364,16 @@ void ev_web_view_select_all(EvWebView *webview) { webkit_web_view_select_all(WEBKIT_WEB_VIEW(webview)); +} + +gboolean +ev_web_view_zoom_in(EvWebView *webview) +{ + webkit_web_view_zoom_in(WEBKIT_WEB_VIEW(webview)); +} + +gboolean +ev_web_view_zoom_out(EvWebView *webview) +{ + webkit_web_view_zoom_out(WEBKIT_WEB_VIEW(webview)); } \ No newline at end of file -- cgit v1.2.1 From d4ea4f2056a2863c7a37ad83e73bb63301de5022 Mon Sep 17 00:00:00 2001 From: rootavish Date: Fri, 25 Jul 2014 18:32:19 +0530 Subject: Fixing dispose functions, display in webview Fixed the backend epub_document_finalize function which was caused caja to crash when you opened the document properties dialog. Fixed the ev_window_dispose and the webview's dispose and finalise functions, now the window closes without any glib-critical errors. Also now it is possible to read epub documents, once you have changed pages at least once, I still have to figure out where I call load_uri at document load. --- libview/ev-web-view.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index aa31751d..b28befd7 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -48,7 +48,6 @@ struct _EvWebViewClass { WebKitWebViewClass base_class; }; -G_DEFINE_TYPE (EvWebView, ev_web_view, WEBKIT_TYPE_WEB_VIEW) /*** Callbacks ***/ static void ev_web_view_change_page (EvWebView *webview, @@ -59,15 +58,13 @@ static void ev_web_view_page_changed_cb (EvDocumentModel gint new_page, EvWebView *webview); /*** GObject ***/ +static void ev_web_view_dispose (GObject *object); -#if GTK_CHECK_VERSION (3, 0, 0) -static void ev_view_dispose (GObject *object); -#else -static void ev_web_view_destroy (GtkObject *object); -#endif +static void ev_web_view_finalize (GObject *object); static void ev_web_view_class_init (EvWebViewClass *klass); static void ev_web_view_init (EvWebView *webview); +G_DEFINE_TYPE (EvWebView, ev_web_view, WEBKIT_TYPE_WEB_VIEW) static void web_view_update_range_and_current_page (EvWebView *webview) { @@ -83,11 +80,7 @@ web_view_update_range_and_current_page (EvWebView *webview) } static void -#if GTK_CHECK_VERSION (3, 0, 0) ev_web_view_dispose (GObject *object) -#else -ev_web_view_destroy (GtkObject *object) -#endif { EvWebView *webview = EV_WEB_VIEW (object); @@ -101,25 +94,23 @@ ev_web_view_destroy (GtkObject *object) webview->model = NULL; }; -#if GTK_CHECK_VERSION (3, 0, 0) + G_OBJECT_CLASS (ev_web_view_parent_class)->dispose (object); -#else - GTK_OBJECT_CLASS (ev_web_view_parent_class)->destroy (object); -#endif } static void ev_web_view_class_init (EvWebViewClass *klass) { + G_OBJECT_CLASS(klass)->finalize = ev_web_view_finalize; + G_OBJECT_CLASS(klass)->dispose = ev_web_view_dispose; } static void ev_web_view_init (EvWebView *webview) { gtk_widget_set_can_focus (GTK_WIDGET (webview), TRUE); -#if GTK_CHECK_VERSION (3, 0, 0) + gtk_widget_set_has_window (GTK_WIDGET (webview), TRUE); -#endif webview->current_page = 0; @@ -127,6 +118,12 @@ ev_web_view_init (EvWebView *webview) } +static void +ev_web_view_finalize (GObject *object) +{ + G_OBJECT_CLASS(ev_web_view_parent_class)->finalize(object); +} + /*** Callbacks ***/ static void @@ -140,6 +137,7 @@ ev_web_view_change_page (EvWebView *webview, webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)page->backend_page); webview->current_page = new_page; + ev_document_model_set_page(webview->model,new_page); } static void @@ -249,6 +247,7 @@ ev_web_view_set_model (EvWebView *webview, /* Initialize webview from model */ webview->fullscreen = ev_document_model_get_fullscreen (webview->model); + webview->document = ev_document_model_get_document(webview->model); webview->inverted_colors = ev_document_model_get_inverted_colors(webview->model); ev_web_view_document_changed_cb (webview->model, NULL, webview); @@ -265,7 +264,7 @@ ev_web_view_set_model (EvWebView *webview, void ev_web_view_reload_page (EvWebView *webview, - gint page) + gint page) { webkit_web_view_reload (WEBKIT_WEB_VIEW(webview)); } @@ -370,10 +369,12 @@ gboolean ev_web_view_zoom_in(EvWebView *webview) { webkit_web_view_zoom_in(WEBKIT_WEB_VIEW(webview)); + return TRUE; } gboolean ev_web_view_zoom_out(EvWebView *webview) { webkit_web_view_zoom_out(WEBKIT_WEB_VIEW(webview)); + return TRUE; } \ No newline at end of file -- cgit v1.2.1 From 57a3618d9254364157a12df39caebbf9247d5aca Mon Sep 17 00:00:00 2001 From: rootavish Date: Sat, 26 Jul 2014 12:26:32 +0530 Subject: Reading epub documents possible Alebit with a bit of bugs as far as navigation etc. are possible, we can read an epub document in Atril. The document will be displayed with thumbnails, and all keyboard shortcuts work. Menu options, the ones that I have currently added do work. I Will now move on to features such as inverted colors, document index, etc, most of which should be simple to add. Also made changes so that the presentation view does not fire up while displaying an epub document. Also added the feature to copy text to clipboard using the Atril menu. --- libview/ev-web-view.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index b28befd7..a1caba36 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -1,7 +1,7 @@ /* this file is part of atril, a mate document viewer * * Copyright (C) 2014 Avishkar Gupta - * Based on ev-view.c + * Based on ev-view.c, also a part of atril, a mate document viewer. * * Atril is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by @@ -28,8 +28,10 @@ #else #include #endif + #include "ev-web-view.h" #include "ev-document-model.h" + #define EV_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_WEB_VIEW, EvWebViewClass)) #define EV_IS_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_WEB_VIEW)) #define EV_WEB_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_WEB_VIEW, EvWebViewClass)) @@ -133,11 +135,12 @@ ev_web_view_change_page (EvWebView *webview, g_return_if_fail(EV_IS_WEB_VIEW(webview)); EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS(webview->document); + EvPage *page = klass->get_page(webview->document,new_page); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)page->backend_page); webview->current_page = new_page; ev_document_model_set_page(webview->model,new_page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)page->backend_page); } static void @@ -187,11 +190,8 @@ ev_web_view_document_changed_cb (EvDocumentModel *model, } gint current_page = ev_document_model_get_page(model); - if (webview->current_page != current_page) { - ev_web_view_change_page (webview, current_page); - } else { - webkit_web_view_reload (WEBKIT_WEB_VIEW(webview)); - } + + ev_web_view_change_page (webview, current_page); } } @@ -365,6 +365,18 @@ ev_web_view_select_all(EvWebView *webview) webkit_web_view_select_all(WEBKIT_WEB_VIEW(webview)); } +void +ev_web_view_copy(EvWebView *webview) +{ + /* If for some reason we don't have a selection any longer,best to be safe*/ + if (ev_web_view_get_has_selection(webview) == FALSE) + return; + if (webkit_web_view_can_copy_clipboard(WEBKIT_WEB_VIEW(webview))) { + webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(webview)); + } + +} + gboolean ev_web_view_zoom_in(EvWebView *webview) { -- cgit v1.2.1 From 60b002aab6c2ee610377d46208ee16dda1e94fc3 Mon Sep 17 00:00:00 2001 From: rootavish Date: Tue, 29 Jul 2014 19:57:02 +0530 Subject: Searching single pages in epub ..and other fixing other bugs that were present once the webview was added, like the escape key command etc. Will look to refactor the thumbnails into ev-web-view.c. In the next commit I'll extend this search over the entire document.Also will incorporate document index(table of contents). --- libview/ev-web-view.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index a1caba36..6b134a0c 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -31,11 +31,21 @@ #include "ev-web-view.h" #include "ev-document-model.h" +#include "ev-jobs.h" #define EV_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_WEB_VIEW, EvWebViewClass)) #define EV_IS_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_WEB_VIEW)) #define EV_WEB_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_WEB_VIEW, EvWebViewClass)) +typedef struct _SearchParams { + gboolean case_sensitive; + guint page_current; + gboolean search_jump; + gchar* search_string; + guint on_result; + guint n_results; +}SearchParams; + struct _EvWebView { WebKitWebView web_view; @@ -44,6 +54,7 @@ struct _EvWebView gint current_page; gboolean inverted_colors ; gboolean fullscreen; + SearchParams *search; }; struct _EvWebViewClass @@ -116,8 +127,11 @@ ev_web_view_init (EvWebView *webview) webview->current_page = 0; - webview->fullscreen = FALSE; + webview->search = g_new0(SearchParams, 1); + + webview->search->search_jump = TRUE ; + webview->fullscreen = FALSE; } static void @@ -294,6 +308,7 @@ ev_web_view_next_page (EvWebView *webview) if (page < n_pages) { ev_document_model_set_page (webview->model, page); EvPage *webpage = ev_document_get_page(webview->document,page); + webview->current_page = page ; webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webpage->backend_page); return TRUE; } else if (page == n_pages) { @@ -341,18 +356,116 @@ ev_web_view_handle_link(EvWebView *webview,EvLink *link) } +/* Searching */ void ev_web_view_find_next(EvWebView *webview) { - + /*First search for the next item on the current page*/ + webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), + webview->search->search_string, + webview->search->case_sensitive, + TRUE, + FALSE); } void ev_web_view_find_previous(EvWebView *webview) { + webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), + webview->search->search_string, + webview->search->case_sensitive, + FALSE, + TRUE); +} + +void +ev_web_view_find_set_highlight_search(EvWebView *webview, gboolean visible) +{ + webkit_web_view_set_highlight_text_matches(WEBKIT_WEB_VIEW(webview),visible); +} +typedef struct _FindCBStruct { + EvJobFind *job; + gint page; +}FindCBStruct; + +static void +find_page_change_cb(WebKitWebView *webview, + WebKitWebFrame *webframe, + FindCBStruct *findcbs) +{ + findcbs->job->results[findcbs->page] = webkit_web_view_mark_text_matches(WEBKIT_WEB_VIEW(webview), + findcbs->job->text, + findcbs->job->case_sensitive, + 0); + ev_web_view_find_set_highlight_search(webview, TRUE); + + webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), + findcbs->job->text, + findcbs->job->case_sensitive, + TRUE, + FALSE); +} +void +ev_web_view_find_changed(EvWebView *webview, gint page_found_on,EvJobFind *job) +{ + if (job->has_results == FALSE) + return; + + if (webview->search->search_jump == TRUE) { + + webview->search->on_result = 1; + webview->search->case_sensitive = job->case_sensitive; + webview->search->search_string = g_strdup(job->text); + webview->search->search_jump = FALSE; + + if (page_found_on != webview->current_page) { + ev_web_view_change_page(webview, page_found_on); + + FindCBStruct *findstruct = g_new0 (FindCBStruct, 1); + findstruct->job = job; + findstruct->page = page_found_on; + + g_signal_connect(WEBKIT_WEB_VIEW(webview),"document-load-finished",G_CALLBACK(find_page_change_cb),findstruct); + } + else { + job->results[webview->current_page] = webkit_web_view_mark_text_matches(WEBKIT_WEB_VIEW(webview), + job->text, + job->case_sensitive, + 0); + + ev_web_view_find_set_highlight_search(webview, TRUE); + } + } +} + +void +ev_web_view_find_search_changed(EvWebView *webview) +{ + ev_web_view_find_set_highlight_search(webview,FALSE); + webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); + webview->search->search_jump = TRUE; +} + +void +ev_web_view_find_cancel(EvWebView *webview) +{ + ev_web_view_find_set_highlight_search(webview,FALSE); + webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); +} + +void +ev_web_view_empty_search(EvWebView *webview) +{ + SearchParams *search = webview->search ; + search->case_sensitive = FALSE; + if (search->search_string) + g_free(search->search_string); + search->search_string = NULL; + search->search_jump = TRUE ; } +/* Selection */ gboolean ev_web_view_get_has_selection(EvWebView *webview) { -- cgit v1.2.1 From 5f3f572777cfcb64a92a4671fb2aff5faa5cefa4 Mon Sep 17 00:00:00 2001 From: rootavish Date: Sun, 3 Aug 2014 12:23:21 +0530 Subject: Table of contents(index) for epub The documents can finally be read alongside a TOC, I tested it with a variety of documents before this commit, so I presume it should work with all. Also fixed the part where I had screwed up PDF annotations owing to a wrong call. In the next commit, fully functional searching would be up, using HTML parser of libxml in combination with webkit. Also some other minor changes. --- libview/ev-web-view.c | 55 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 6b134a0c..152e2542 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -55,6 +55,7 @@ struct _EvWebView gboolean inverted_colors ; gboolean fullscreen; SearchParams *search; + gchar *hlink; }; struct _EvWebViewClass @@ -106,7 +107,10 @@ ev_web_view_dispose (GObject *object) g_object_unref(webview->model); webview->model = NULL; }; - + if (webview->hlink) { + g_free(webview->hlink); + webview->hlink = NULL; + } G_OBJECT_CLASS (ev_web_view_parent_class)->dispose (object); } @@ -132,6 +136,8 @@ ev_web_view_init (EvWebView *webview) webview->search->search_jump = TRUE ; webview->fullscreen = FALSE; + + webview->hlink = NULL; } static void @@ -150,11 +156,19 @@ ev_web_view_change_page (EvWebView *webview, EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS(webview->document); - EvPage *page = klass->get_page(webview->document,new_page); - webview->current_page = new_page; ev_document_model_set_page(webview->model,new_page); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)page->backend_page); + + webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); + if (webview->hlink) { + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webview->hlink); + g_free(webview->hlink); + webview->hlink = NULL; + } + else { + EvPage *page = klass->get_page(webview->document,new_page); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)page->backend_page); + } } static void @@ -179,7 +193,7 @@ ev_web_view_new (void) GtkWidget *webview; webview = g_object_new (EV_TYPE_WEB_VIEW, NULL); - + return webview; } @@ -353,7 +367,36 @@ ev_web_view_previous_page (EvWebView *webview) void ev_web_view_handle_link(EvWebView *webview,EvLink *link) { + EvLinkAction *action = NULL; + EvLinkDest *dest = NULL; + EvLinkDestType dest_type ; + action = ev_link_get_action(link); + if (action == NULL) + return; + + dest = ev_link_action_get_dest(action); + + if (dest == NULL) + return; + + dest_type = ev_link_dest_get_dest_type(dest); + + switch(dest_type) { + case EV_LINK_DEST_TYPE_PAGE: { + ev_document_model_set_page(webview->model,ev_link_dest_get_page(dest)); + break; + } + + case EV_LINK_DEST_TYPE_HLINK: { + const gchar *uri = ev_link_dest_get_named_dest(dest); + ev_document_model_set_page(webview->model,ev_link_dest_get_page(dest)); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),uri); + break; + + default:return; + } + } } /* Searching */ @@ -398,7 +441,7 @@ find_page_change_cb(WebKitWebView *webview, findcbs->job->text, findcbs->job->case_sensitive, 0); - ev_web_view_find_set_highlight_search(webview, TRUE); + ev_web_view_find_set_highlight_search(EV_WEB_VIEW(webview), TRUE); webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), findcbs->job->text, -- cgit v1.2.1 From 56880392a6678ccec12bbec016939597acd49b07 Mon Sep 17 00:00:00 2001 From: rootavish Date: Wed, 6 Aug 2014 15:34:02 +0530 Subject: Searching in epub documents I added the capability to search through documents. The search is quite buggy, and we'll be taking care of each bug one at a time. --- libview/ev-web-view.c | 273 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 191 insertions(+), 82 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 152e2542..0756b0f0 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -37,13 +37,19 @@ #define EV_IS_WEB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_WEB_VIEW)) #define EV_WEB_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EV_TYPE_WEB_VIEW, EvWebViewClass)) + typedef enum { + EV_WEB_VIEW_FIND_NEXT, + EV_WEB_VIEW_FIND_PREV + } EvWebViewFindDirection; + typedef struct _SearchParams { gboolean case_sensitive; - guint page_current; gboolean search_jump; gchar* search_string; - guint on_result; + gint on_result; guint n_results; + guint *results; + EvWebViewFindDirection direction; }SearchParams; struct _EvWebView @@ -65,20 +71,21 @@ struct _EvWebViewClass /*** Callbacks ***/ static void ev_web_view_change_page (EvWebView *webview, - gint new_page); + gint new_page); static void ev_web_view_page_changed_cb (EvDocumentModel *model, gint old_page, gint new_page, EvWebView *webview); /*** GObject ***/ -static void ev_web_view_dispose (GObject *object); +static void ev_web_view_dispose (GObject *object); -static void ev_web_view_finalize (GObject *object); +static void ev_web_view_finalize (GObject *object); static void ev_web_view_class_init (EvWebViewClass *klass); static void ev_web_view_init (EvWebView *webview); G_DEFINE_TYPE (EvWebView, ev_web_view, WEBKIT_TYPE_WEB_VIEW) + static void web_view_update_range_and_current_page (EvWebView *webview) { @@ -106,12 +113,18 @@ ev_web_view_dispose (GObject *object) if (webview->model) { g_object_unref(webview->model); webview->model = NULL; - }; + } + if (webview->hlink) { g_free(webview->hlink); webview->hlink = NULL; } + if (webview->search) { + g_free(webview->search); + webview->search = NULL; + } + G_OBJECT_CLASS (ev_web_view_parent_class)->dispose (object); } @@ -132,7 +145,10 @@ ev_web_view_init (EvWebView *webview) webview->current_page = 0; webview->search = g_new0(SearchParams, 1); - + webview->search->search_string = NULL; + webview->search->on_result = -1 ; + webview->search->n_results = 0; + webview->search->results = NULL; webview->search->search_jump = TRUE ; webview->fullscreen = FALSE; @@ -400,112 +416,205 @@ ev_web_view_handle_link(EvWebView *webview,EvLink *link) } /* Searching */ -void -ev_web_view_find_next(EvWebView *webview) -{ - /*First search for the next item on the current page*/ - webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), - webview->search->search_string, - webview->search->case_sensitive, - TRUE, - FALSE); -} -void -ev_web_view_find_previous(EvWebView *webview) +static void +jump_to_find_result_on_page(EvWebView *webview,EvWebViewFindDirection direction) { + gboolean forward,wrap; + + if (direction == EV_WEB_VIEW_FIND_NEXT) { + forward = TRUE; + wrap = FALSE; + } + else { + forward = FALSE; + wrap = FALSE; + } + webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), - webview->search->search_string, - webview->search->case_sensitive, - FALSE, - TRUE); + webview->search->search_string, + webview->search->case_sensitive, + forward, + wrap); } -void -ev_web_view_find_set_highlight_search(EvWebView *webview, gboolean visible) +static void +jump_to_find_result(EvWebView *webview, + GParamSpec *pspec, + gpointer data) { - webkit_web_view_set_highlight_text_matches(WEBKIT_WEB_VIEW(webview),visible); + gint n_results; + gboolean forward ; + gboolean wrap ; + + if (webkit_web_view_get_load_status(WEBKIT_WEB_VIEW(webview)) != WEBKIT_LOAD_FINISHED) { + return; + } + + if (!webview->search->search_string) { + return; + } + + n_results = webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW(webview), + webview->search->search_string, + webview->search->case_sensitive, + 0); + + ev_web_view_find_set_highlight_search(webview,TRUE); + + if (webview->search->direction == EV_WEB_VIEW_FIND_NEXT) { + forward = TRUE ; + wrap = FALSE; + } + else { + forward = FALSE; + wrap = TRUE ; + } + + if (n_results > 0 && webview->search->on_result < n_results) { + webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), + webview->search->search_string, + webview->search->case_sensitive, + forward, + wrap); + + webview->search->search_jump = FALSE; + } } -typedef struct _FindCBStruct { - EvJobFind *job; - gint page; -}FindCBStruct; +static gint +ev_web_view_find_get_n_results (EvWebView *webview, gint page) +{ + return webview->search->results[page]; +} +/** + * jump_to_find_page + * @webview: #EvWebView instance + * @direction: Direction to look + * @shift: Shift from current page + * + * Jumps to the first page that has occurences of searched word. + * Uses a direction where to look and a shift from current page. + * + */ static void -find_page_change_cb(WebKitWebView *webview, - WebKitWebFrame *webframe, - FindCBStruct *findcbs) -{ - findcbs->job->results[findcbs->page] = webkit_web_view_mark_text_matches(WEBKIT_WEB_VIEW(webview), - findcbs->job->text, - findcbs->job->case_sensitive, - 0); - ev_web_view_find_set_highlight_search(EV_WEB_VIEW(webview), TRUE); - - webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), - findcbs->job->text, - findcbs->job->case_sensitive, - TRUE, - FALSE); +jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint shift) +{ + int n_pages, i; + + n_pages = ev_document_get_n_pages (webview->document); + + for (i = 0; i < n_pages; i++) { + int page; + + if (direction == EV_WEB_VIEW_FIND_NEXT) + page = webview->current_page + i; + else + page = webview->current_page - i; + page += shift; + + if (page >= n_pages) { + page = page - n_pages; + } else if (page < 0) + page = page + n_pages; + + if (page == webview->current_page) + jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); + + if (ev_web_view_find_get_n_results (webview, page) > 0) { + webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); + ev_document_model_set_page (webview->model, page); + webview->search->direction = direction; + break; + } + } } + void -ev_web_view_find_changed(EvWebView *webview, gint page_found_on,EvJobFind *job) +ev_web_view_find_changed (EvWebView *webview, guint *results, gchar *text,gboolean case_sensitive) { - if (job->has_results == FALSE) - return; + webview->search->results = results; + webview->search->search_string = g_strdup(text); + webview->search->case_sensitive = case_sensitive; if (webview->search->search_jump == TRUE) { + jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 0); + } else { + jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); + } +} - webview->search->on_result = 1; - webview->search->case_sensitive = job->case_sensitive; - webview->search->search_string = g_strdup(job->text); - webview->search->search_jump = FALSE; - - if (page_found_on != webview->current_page) { - ev_web_view_change_page(webview, page_found_on); +void +ev_web_view_find_next (EvWebView *webview) +{ + gint n_results; - FindCBStruct *findstruct = g_new0 (FindCBStruct, 1); - findstruct->job = job; - findstruct->page = page_found_on; - - g_signal_connect(WEBKIT_WEB_VIEW(webview),"document-load-finished",G_CALLBACK(find_page_change_cb),findstruct); - } - else { - job->results[webview->current_page] = webkit_web_view_mark_text_matches(WEBKIT_WEB_VIEW(webview), - job->text, - job->case_sensitive, - 0); + n_results = ev_web_view_find_get_n_results (webview, webview->current_page); + webview->search->on_result++; - ev_web_view_find_set_highlight_search(webview, TRUE); - } + if (webview->search->on_result >= n_results) { + webview->search->on_result = 0; + jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 1); + } + else { + jump_to_find_result_on_page (webview, EV_WEB_VIEW_FIND_NEXT); } } void -ev_web_view_find_search_changed(EvWebView *webview) +ev_web_view_find_previous (EvWebView *webview) { - ev_web_view_find_set_highlight_search(webview,FALSE); - webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); + webview->search->on_result--; + + if (webview->search->on_result < 0) { + jump_to_find_page (webview, EV_WEB_VIEW_FIND_PREV, -1); + webview->search->on_result = MAX (0, ev_web_view_find_get_n_results (webview, webview->current_page) - 1); + } else { + jump_to_find_result_on_page (webview,EV_WEB_VIEW_FIND_PREV); + } +} + +void +ev_web_view_find_search_changed (EvWebView *webview,gboolean visible) +{ + /* search string has changed, focus on new search result */ + if (visible) { + g_signal_connect(webview, + "notify::load-status", + G_CALLBACK(jump_to_find_result), + NULL); + } + else { + g_signal_handlers_disconnect_by_func(webview, + jump_to_find_result, + NULL); + } + webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); + webview->search->search_jump = TRUE; + + if (webview->search->search_string) { + g_free(webview->search->search_string); + webview->search->search_string = NULL; + } } void -ev_web_view_find_cancel(EvWebView *webview) +ev_web_view_find_set_highlight_search (EvWebView *webview, gboolean value) { - ev_web_view_find_set_highlight_search(webview,FALSE); - webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); + webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW(webview),value); } void -ev_web_view_empty_search(EvWebView *webview) -{ - SearchParams *search = webview->search ; - search->case_sensitive = FALSE; - if (search->search_string) - g_free(search->search_string); - search->search_string = NULL; - search->search_jump = TRUE ; +ev_web_view_find_cancel (EvWebView *webview) +{ + g_signal_handlers_disconnect_by_func(webview, + jump_to_find_result, + NULL); + + webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); + ev_web_view_find_set_highlight_search(webview,FALSE); } /* Selection */ -- cgit v1.2.1 From ff0a79e545356046c7145bff0630a7cd50ad977c Mon Sep 17 00:00:00 2001 From: rootavish Date: Thu, 7 Aug 2014 17:43:55 +0530 Subject: Ability to search through epub documents You can now search through the entire epub document. In the next commit I'm adding support for webkit2 with gtk3. --- libview/ev-web-view.c | 54 +++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 25 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 0756b0f0..e6bef75a 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -436,10 +436,12 @@ jump_to_find_result_on_page(EvWebView *webview,EvWebViewFindDirection direction) webview->search->case_sensitive, forward, wrap); + + webview->search->search_jump = FALSE; } static void -jump_to_find_result(EvWebView *webview, +jump_to_find_results(EvWebView *webview, GParamSpec *pspec, gpointer data) { @@ -496,8 +498,7 @@ ev_web_view_find_get_n_results (EvWebView *webview, gint page) * * Jumps to the first page that has occurences of searched word. * Uses a direction where to look and a shift from current page. - * - */ +**/ static void jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint shift) { @@ -507,20 +508,22 @@ jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint sh for (i = 0; i < n_pages; i++) { int page; - + if (direction == EV_WEB_VIEW_FIND_NEXT) page = webview->current_page + i; else page = webview->current_page - i; page += shift; - + if (page >= n_pages) { page = page - n_pages; } else if (page < 0) page = page + n_pages; - if (page == webview->current_page) + if (page == webview->current_page && ev_web_view_find_get_n_results(webview,page) > 0) { jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); + break; + } if (ev_web_view_find_get_n_results (webview, page) > 0) { webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); @@ -537,11 +540,9 @@ ev_web_view_find_changed (EvWebView *webview, guint *results, gchar *text,gboole webview->search->results = results; webview->search->search_string = g_strdup(text); webview->search->case_sensitive = case_sensitive; - + webview->search->on_result = 0; if (webview->search->search_jump == TRUE) { jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 0); - } else { - jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); } } @@ -576,20 +577,9 @@ ev_web_view_find_previous (EvWebView *webview) } void -ev_web_view_find_search_changed (EvWebView *webview,gboolean visible) +ev_web_view_find_search_changed (EvWebView *webview) { /* search string has changed, focus on new search result */ - if (visible) { - g_signal_connect(webview, - "notify::load-status", - G_CALLBACK(jump_to_find_result), - NULL); - } - else { - g_signal_handlers_disconnect_by_func(webview, - jump_to_find_result, - NULL); - } webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); webview->search->search_jump = TRUE; @@ -609,14 +599,27 @@ ev_web_view_find_set_highlight_search (EvWebView *webview, gboolean value) void ev_web_view_find_cancel (EvWebView *webview) { - g_signal_handlers_disconnect_by_func(webview, - jump_to_find_result, - NULL); - webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); ev_web_view_find_set_highlight_search(webview,FALSE); } + +void +ev_web_view_set_handler(EvWebView *webview,gboolean visible) +{ + if (visible) { + g_signal_connect(webview, + "notify::load-status", + G_CALLBACK(jump_to_find_results), + NULL); + } + else { + g_signal_handlers_disconnect_by_func(webview, + jump_to_find_results, + NULL); + } +} + /* Selection */ gboolean ev_web_view_get_has_selection(EvWebView *webview) @@ -642,6 +645,7 @@ ev_web_view_copy(EvWebView *webview) } +/*Zoom control*/ gboolean ev_web_view_zoom_in(EvWebView *webview) { -- cgit v1.2.1 From 3a013d3b19c5a81372560e735cf6f9f5c3ebdd37 Mon Sep 17 00:00:00 2001 From: rootavish Date: Sat, 9 Aug 2014 20:48:25 +0530 Subject: GTK3, Webkit2 support for epub I added the code to make it possible to build Atril with GTK3 and webkit2. Everything runs fine with both GTK3 and GTK2. The find module for epub was also tested and changed. Now I shall first attempt to fix some Glib errors, and the problem of the temporary directory not getting deleted, that arose when I stabilized the thumbnails. --- libview/ev-web-view.c | 235 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 209 insertions(+), 26 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index e6bef75a..f88dd84a 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -44,12 +44,11 @@ typedef struct _SearchParams { gboolean case_sensitive; - gboolean search_jump; gchar* search_string; + EvWebViewFindDirection direction; + gboolean search_jump; gint on_result; - guint n_results; guint *results; - EvWebViewFindDirection direction; }SearchParams; struct _EvWebView @@ -61,6 +60,11 @@ struct _EvWebView gboolean inverted_colors ; gboolean fullscreen; SearchParams *search; +#if GTK_CHECK_VERSION (3, 0, 0) + WebKitFindController *findcontroller; + WebKitFindOptions findoptions; + gdouble zoom_level; +#endif gchar *hlink; }; @@ -141,16 +145,16 @@ ev_web_view_init (EvWebView *webview) gtk_widget_set_can_focus (GTK_WIDGET (webview), TRUE); gtk_widget_set_has_window (GTK_WIDGET (webview), TRUE); - + webview->current_page = 0; webview->search = g_new0(SearchParams, 1); webview->search->search_string = NULL; + webview->search->on_result = -1 ; - webview->search->n_results = 0; webview->search->results = NULL; webview->search->search_jump = TRUE ; - + webview->fullscreen = FALSE; webview->hlink = NULL; @@ -174,8 +178,11 @@ ev_web_view_change_page (EvWebView *webview, webview->current_page = new_page; ev_document_model_set_page(webview->model,new_page); - +#if GTK_CHECK_VERSION (3, 0, 0) + webkit_find_controller_search_finish(webview->findcontroller); +#else webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); +#endif if (webview->hlink) { webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)webview->hlink); g_free(webview->hlink); @@ -209,7 +216,16 @@ ev_web_view_new (void) GtkWidget *webview; webview = g_object_new (EV_TYPE_WEB_VIEW, NULL); - + + #if GTK_CHECK_VERSION (3, 0, 0) + EV_WEB_VIEW(webview)->findcontroller = webkit_web_view_get_find_controller (WEBKIT_WEB_VIEW(webview)); + EV_WEB_VIEW(webview)->findoptions = webkit_find_controller_get_options (EV_WEB_VIEW(webview)->findcontroller); + + EV_WEB_VIEW(webview)->zoom_level = 1.0; + + EV_WEB_VIEW(webview)->findoptions |= WEBKIT_FIND_OPTIONS_NONE; + #endif + return webview; } @@ -417,8 +433,10 @@ ev_web_view_handle_link(EvWebView *webview,EvLink *link) /* Searching */ +#if !GTK_CHECK_VERSION (3, 0, 0) static void -jump_to_find_result_on_page(EvWebView *webview,EvWebViewFindDirection direction) +jump_to_find_result_on_page(EvWebView *webview, + EvWebViewFindDirection direction) { gboolean forward,wrap; @@ -431,6 +449,9 @@ jump_to_find_result_on_page(EvWebView *webview,EvWebViewFindDirection direction) wrap = FALSE; } + if (webview->search->search_jump) { + wrap = TRUE; + } webkit_web_view_search_text (WEBKIT_WEB_VIEW(webview), webview->search->search_string, webview->search->case_sensitive, @@ -439,24 +460,70 @@ jump_to_find_result_on_page(EvWebView *webview,EvWebViewFindDirection direction) webview->search->search_jump = FALSE; } +#endif +#if GTK_CHECK_VERSION (3, 0, 0) +static void +results_counted_cb(WebKitFindController *findcontroller, + guint match_count, + EvWebView *webview) +{ + if (match_count > 0 && webview->search->on_result < match_count) { + webkit_find_controller_search(findcontroller, + webview->search->search_string, + webview->findoptions, + match_count); + webview->search->search_jump = FALSE; + } +} +#endif +/* + * Jump to find results once we have changed the page in the webview. + */ +#if GTK_CHECK_VERSION (3, 0, 0) +static void +jump_to_find_results(EvWebView *webview, + WebKitLoadEvent load_event, + gpointer data) +#else static void jump_to_find_results(EvWebView *webview, GParamSpec *pspec, gpointer data) +#endif { + #if !GTK_CHECK_VERSION (3, 0, 0) gint n_results; gboolean forward ; gboolean wrap ; - + if (webkit_web_view_get_load_status(WEBKIT_WEB_VIEW(webview)) != WEBKIT_LOAD_FINISHED) { return; } - +#else + if ( load_event != WEBKIT_LOAD_FINISHED) { + return; + } +#endif if (!webview->search->search_string) { return; } +#if GTK_CHECK_VERSION (3, 0, 0) + if (webview->search->direction == EV_WEB_VIEW_FIND_NEXT) { + webview->findoptions &= ~WEBKIT_FIND_OPTIONS_BACKWARDS; + webview->findoptions &= ~WEBKIT_FIND_OPTIONS_WRAP_AROUND; + } + else { + webview->findoptions |= WEBKIT_FIND_OPTIONS_BACKWARDS; + webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND; + } + + webkit_find_controller_count_matches (webview->findcontroller, + webview->search->search_string, + webview->findoptions, + G_MAXUINT); +#else n_results = webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW(webview), webview->search->search_string, webview->search->case_sensitive, @@ -482,6 +549,8 @@ jump_to_find_results(EvWebView *webview, webview->search->search_jump = FALSE; } +#endif + webview->search->search_jump = FALSE; } static gint @@ -520,15 +589,41 @@ jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint sh } else if (page < 0) page = page + n_pages; - if (page == webview->current_page && ev_web_view_find_get_n_results(webview,page) > 0) { + if (page == webview->current_page && ev_web_view_find_get_n_results(webview,page) > 0) { +#if !GTK_CHECK_VERSION (3, 0, 0) jump_to_find_result_on_page(webview,EV_WEB_VIEW_FIND_NEXT); +#else + if (direction == EV_WEB_VIEW_FIND_PREV) { + webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND; + webview->findoptions |= WEBKIT_FIND_OPTIONS_BACKWARDS; + } + else { + if (webview->search->search_jump) + webview->findoptions |= WEBKIT_FIND_OPTIONS_WRAP_AROUND; + else + webview->findoptions &= ~WEBKIT_FIND_OPTIONS_WRAP_AROUND; + + webview->findoptions &= ~WEBKIT_FIND_OPTIONS_BACKWARDS; + } + + webkit_find_controller_search (webview->findcontroller, + webview->search->search_string, + webview->findoptions, + /*Highlight all the results.*/ + G_MAXUINT); + webview->search->search_jump = FALSE; +#endif break; } if (ev_web_view_find_get_n_results (webview, page) > 0) { + webview->search->direction = direction; +#if !GTK_CHECK_VERSION (3, 0, 0) webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW(webview)); +#else + webkit_find_controller_search_finish(webview->findcontroller); +#endif ev_document_model_set_page (webview->model, page); - webview->search->direction = direction; break; } } @@ -537,11 +632,19 @@ jump_to_find_page (EvWebView *webview, EvWebViewFindDirection direction, gint sh void ev_web_view_find_changed (EvWebView *webview, guint *results, gchar *text,gboolean case_sensitive) { - webview->search->results = results; + webview->search->results = results; + webview->search->on_result = 0; webview->search->search_string = g_strdup(text); webview->search->case_sensitive = case_sensitive; - webview->search->on_result = 0; - if (webview->search->search_jump == TRUE) { + if (webview->search->search_jump == TRUE) { +#if GTK_CHECK_VERSION (3, 0, 0) + if (!case_sensitive) { + webview->findoptions |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE; + } + else { + webview->findoptions &= ~WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE; + } +#endif jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 0); } } @@ -559,7 +662,11 @@ ev_web_view_find_next (EvWebView *webview) jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 1); } else { +#if GTK_CHECK_VERSION (3, 0, 0) + webkit_find_controller_search_next(webview->findcontroller); +#else jump_to_find_result_on_page (webview, EV_WEB_VIEW_FIND_NEXT); +#endif } } @@ -572,7 +679,11 @@ ev_web_view_find_previous (EvWebView *webview) jump_to_find_page (webview, EV_WEB_VIEW_FIND_PREV, -1); webview->search->on_result = MAX (0, ev_web_view_find_get_n_results (webview, webview->current_page) - 1); } else { +#if GTK_CHECK_VERSION (3, 0, 0) + webkit_find_controller_search_previous(webview->findcontroller); +#else jump_to_find_result_on_page (webview,EV_WEB_VIEW_FIND_PREV); +#endif } } @@ -580,68 +691,127 @@ void ev_web_view_find_search_changed (EvWebView *webview) { /* search string has changed, focus on new search result */ +#if !GTK_CHECK_VERSION(3, 0, 0) webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); - - webview->search->search_jump = TRUE; - +#endif if (webview->search->search_string) { g_free(webview->search->search_string); webview->search->search_string = NULL; } +#if GTK_CHECK_VERSION(3, 0, 0) + webkit_find_controller_search_finish(webview->findcontroller); +#endif + + webview->search->search_jump = TRUE; } +#if !GTK_CHECK_VERSION (3, 0, 0) void ev_web_view_find_set_highlight_search (EvWebView *webview, gboolean value) { webkit_web_view_set_highlight_text_matches (WEBKIT_WEB_VIEW(webview),value); } +#endif void ev_web_view_find_cancel (EvWebView *webview) { +#if GTK_CHECK_VERSION (3, 0, 0) + webkit_find_controller_search_finish (webview->findcontroller); +#else webkit_web_view_unmark_text_matches(WEBKIT_WEB_VIEW(webview)); ev_web_view_find_set_highlight_search(webview,FALSE); +#endif } + void ev_web_view_set_handler(EvWebView *webview,gboolean visible) { if (visible) { g_signal_connect(webview, +#if GTK_CHECK_VERSION (3, 0, 0) + "load-changed", +#else "notify::load-status", +#endif G_CALLBACK(jump_to_find_results), NULL); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(webview->findcontroller, + "counted-matches", + G_CALLBACK(results_counted_cb), + webview); +#endif } else { g_signal_handlers_disconnect_by_func(webview, jump_to_find_results, NULL); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_handlers_disconnect_by_func(webview, + results_counted_cb, + NULL); +#endif } } -/* Selection */ +/* Selection and copying*/ +#if !GTK_CHECK_VERSION (3, 0, 0) gboolean ev_web_view_get_has_selection(EvWebView *webview) { return webkit_web_view_has_selection(WEBKIT_WEB_VIEW(webview)); } +#endif void ev_web_view_select_all(EvWebView *webview) { +#if GTK_CHECK_VERSION (3, 0, 0) + webkit_web_view_execute_editing_command(WEBKIT_WEB_VIEW(webview), + WEBKIT_EDITING_COMMAND_SELECT_ALL); +#else webkit_web_view_select_all(WEBKIT_WEB_VIEW(webview)); +#endif +} + +#if GTK_CHECK_VERSION (3, 0, 0) +static void +copy_text_cb(WebKitWebView *webview, + GAsyncResult *res, + gpointer data) +{ + gboolean okay_to_copy = webkit_web_view_can_execute_editing_command_finish (WEBKIT_WEB_VIEW(webview), + res, + NULL); + + if (okay_to_copy) { + webkit_web_view_execute_editing_command (WEBKIT_WEB_VIEW(webview), + WEBKIT_EDITING_COMMAND_COPY); + } } +#endif void ev_web_view_copy(EvWebView *webview) { - /* If for some reason we don't have a selection any longer,best to be safe*/ - if (ev_web_view_get_has_selection(webview) == FALSE) - return; - if (webkit_web_view_can_copy_clipboard(WEBKIT_WEB_VIEW(webview))) { - webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(webview)); - } +#if !GTK_CHECK_VERSION (3, 0, 0) + /* If for some reason we don't have a selection any longer,best to be safe */ + if (ev_web_view_get_has_selection(webview) == FALSE) + return; + if (webkit_web_view_can_copy_clipboard(WEBKIT_WEB_VIEW(webview))) { + webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(webview)); + } +#else + webkit_web_view_can_execute_editing_command(WEBKIT_WEB_VIEW(webview), + WEBKIT_EDITING_COMMAND_COPY, + NULL, + (GAsyncReadyCallback)copy_text_cb, + NULL); + +#endif } @@ -649,13 +819,26 @@ ev_web_view_copy(EvWebView *webview) gboolean ev_web_view_zoom_in(EvWebView *webview) { +#if GTK_CHECK_VERSION (3, 0, 0) + webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(webview), + (webview->zoom_level+= 0.1)); +#else webkit_web_view_zoom_in(WEBKIT_WEB_VIEW(webview)); +#endif return TRUE; } gboolean ev_web_view_zoom_out(EvWebView *webview) { +#if GTK_CHECK_VERSION (3, 0, 0) + if (webview->zoom_level == 1) + return FALSE; + + webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(webview), + (webview->zoom_level -= 0.1)); +#else webkit_web_view_zoom_out(WEBKIT_WEB_VIEW(webview)); +#endif return TRUE; } \ No newline at end of file -- cgit v1.2.1 From 1548bcb4629a6a41641a0188003215b3098aa5fc Mon Sep 17 00:00:00 2001 From: rootavish Date: Sun, 10 Aug 2014 01:05:45 +0530 Subject: Page Label handling, other fixes Added the function to handle links from the toolbar, also added functions to disconnect all ev-view handlers once it has been replaced by ev-web-view, and vice-versa(to drop all handler associated to ev-web-view). Also the unref call to job_thumb was causing thumbnail jobs to crash with GTK2, so had to revert that, now we're back to the document folder not getting deleted from disk. --- libview/ev-web-view.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index f88dd84a..b1fe3b08 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -22,6 +22,7 @@ #include #include +#include #if GTK_CHECK_VERSION (3, 0, 0) #include @@ -420,6 +421,15 @@ ev_web_view_handle_link(EvWebView *webview,EvLink *link) break; } + case EV_LINK_DEST_TYPE_PAGE_LABEL: { + const gchar *text = ev_link_dest_get_page_label (dest); + gint page = atoi(text); + + if (page <= ev_document_get_n_pages(webview->document) && page > 0) { + ev_document_model_set_page(webview->model,page-1); + } + break; + } case EV_LINK_DEST_TYPE_HLINK: { const gchar *uri = ev_link_dest_get_named_dest(dest); ev_document_model_set_page(webview->model,ev_link_dest_get_page(dest)); @@ -430,7 +440,6 @@ ev_web_view_handle_link(EvWebView *webview,EvLink *link) } } } - /* Searching */ #if !GTK_CHECK_VERSION (3, 0, 0) @@ -841,4 +850,25 @@ ev_web_view_zoom_out(EvWebView *webview) webkit_web_view_zoom_out(WEBKIT_WEB_VIEW(webview)); #endif return TRUE; +} + +/** + * ev_web_view_disconnect_handlers + * @webview : #EvWebView instance + * + * This function call will disconnect all model signal handlers from the webview, to ensure smooth operation of the Atril-view. + * Equivalent to function ev_view_disconnect_handlers in ev-view.c + */ +void +ev_web_view_disconnect_handlers(EvWebView *webview) +{ + g_signal_handlers_disconnect_by_func(webview->model, + ev_web_view_document_changed_cb, + webview); + g_signal_handlers_disconnect_by_func(webview->model, + ev_web_view_inverted_colors_changed_cb, + webview); + g_signal_handlers_disconnect_by_func(webview->model, + ev_web_view_page_changed_cb, + webview); } \ No newline at end of file -- cgit v1.2.1 From 700637ca1dd675ce18f2e9e56387dab86020a623 Mon Sep 17 00:00:00 2001 From: rootavish Date: Thu, 14 Aug 2014 07:41:35 +0530 Subject: Inverted colors(night) viewing mode for ePub Added the capability to view and epub document with inverted colors, yet to test for documents where we write the stylesheet, although the code is there. --- libview/ev-web-view.c | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index b1fe3b08..5d1f5034 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -58,7 +58,7 @@ struct _EvWebView EvDocument *document; EvDocumentModel *model; gint current_page; - gboolean inverted_colors ; + gboolean inverted_stylesheet ; gboolean fullscreen; SearchParams *search; #if GTK_CHECK_VERSION (3, 0, 0) @@ -157,7 +157,7 @@ ev_web_view_init (EvWebView *webview) webview->search->search_jump = TRUE ; webview->fullscreen = FALSE; - + webview->inverted_stylesheet = FALSE; webview->hlink = NULL; } @@ -262,29 +262,28 @@ ev_web_view_inverted_colors_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWebView *webview) { - guint inverted_colors = ev_document_model_get_inverted_colors (model); - inverted_colors = !inverted_colors; - /*TODO*/ + EvDocument *document = ev_document_model_get_document(model); + + if (ev_document_model_get_inverted_colors(model) == TRUE) { + if (document == NULL) { + ev_document_model_set_inverted_colors(model,FALSE); + return; + } + if (webview->inverted_stylesheet == FALSE) { + ev_document_check_add_night_sheet(document); + webview->inverted_stylesheet = TRUE; + } + ev_document_toggle_night_mode(document,TRUE); + webkit_web_view_reload(WEBKIT_WEB_VIEW(webview)); + } + else { + if (document != NULL) { + ev_document_toggle_night_mode(document,FALSE); + webkit_web_view_reload(WEBKIT_WEB_VIEW(webview)); + } + } } -static void -ev_web_view_fullscreen_changed_cb (EvDocumentModel *model, - GParamSpec *pspec, - EvWebView *webview) -{ - gboolean fullscreen = ev_document_model_get_fullscreen (model); - - webview->fullscreen = fullscreen; -#if GTK_CHECK_VERSION (3, 0, 0) - WebKitWindowProperties *window_properties = - webkit_web_view_get_window_properties (WEBKIT_WEB_VIEW(webview)); - - webkit_window_properties_get_fullscreen(window_properties); - /*TODO*/ -#else - webkit_web_view_set_view_mode(WEBKIT_WEB_VIEW(webview), WEBKIT_WEB_VIEW_VIEW_MODE_FULLSCREEN); -#endif -} void ev_web_view_set_model (EvWebView *webview, EvDocumentModel *model) @@ -309,7 +308,7 @@ ev_web_view_set_model (EvWebView *webview, /* Initialize webview from model */ webview->fullscreen = ev_document_model_get_fullscreen (webview->model); webview->document = ev_document_model_get_document(webview->model); - webview->inverted_colors = ev_document_model_get_inverted_colors(webview->model); + ev_web_view_document_changed_cb (webview->model, NULL, webview); g_signal_connect (webview->model, "notify::document", -- cgit v1.2.1 From 3c122f6d867acecca4e7143d1d0707d7f188a64a Mon Sep 17 00:00:00 2001 From: rootavish Date: Sun, 17 Aug 2014 17:57:36 +0530 Subject: Added epub3 navsheets I came across a document that didn't have an old style toc, and thus the all accomodating navsheet support. Also fixed some mistakes here and there. --- libview/ev-web-view.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libview/ev-web-view.c') diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index 5d1f5034..b42da163 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -249,7 +249,7 @@ ev_web_view_document_changed_cb (EvDocumentModel *model, if(webview->document) { g_object_ref(webview->document); } - + webview->inverted_stylesheet = FALSE; gint current_page = ev_document_model_get_page(model); ev_web_view_change_page (webview, current_page); -- cgit v1.2.1