From e10bf9631652b8533b18a14285db89bd14b4c42e Mon Sep 17 00:00:00 2001 From: rootavish Date: Tue, 1 Jul 2014 20:29:05 +0530 Subject: More changes to accomodate webview - Modified configure.ac to use both webkit2 and webkit1 based on gtk version - Modified Automake file in help/reference/shell/Makefile.am to compile with gtk-doc - Modified ev-document-model to support epub-documents. - Modified ev-window for epub documents. - Modified jobs so epub pages are not rendered. - Modified ev-document, although I'm not sure if this is necessary. Still need to figure out where the web view load uri has to be called to actually load pages, from there the puzzle would be much simpler. Hope to get this done in the week, and pick up the pace now that only six weeks of coding remain before final evaluation. --- libview/ev-document-model.c | 27 ++++++++++++++++++++++++--- libview/ev-document-model.h | 4 +++- libview/ev-jobs.c | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) (limited to 'libview') diff --git a/libview/ev-document-model.c b/libview/ev-document-model.c index 403df466..00ce782b 100644 --- a/libview/ev-document-model.c +++ b/libview/ev-document-model.c @@ -106,10 +106,22 @@ ev_document_model_set_property (GObject *object, ev_document_model_set_page (model, g_value_get_int (value)); break; case PROP_ROTATION: - ev_document_model_set_rotation (model, g_value_get_int (value)); - break; + { + if ( model->document->iswebdocument == TRUE ) { + model->rotation=0; + } + else { + ev_document_model_set_rotation (model, g_value_get_int (value)); + } + break; + } case PROP_INVERTED_COLORS: - ev_document_model_set_inverted_colors (model, g_value_get_boolean (value)); + if ( model->document->iswebdocument == TRUE ) { + atril_web_document_set_inverted_colors(model,g_value_get_boolean(value)); + } + else { + ev_document_model_set_inverted_colors (model, g_value_get_boolean (value)); + } break; case PROP_SCALE: ev_document_model_set_scale (model, g_value_get_double (value)); @@ -490,6 +502,15 @@ ev_document_model_set_inverted_colors (EvDocumentModel *model, g_object_notify (G_OBJECT (model), "inverted-colors"); } +void +atril_web_document_set_inverted_colors (EvDocumentModel *model, + gboolean inverted_colors) +{ + //TODO + model->inverted_colors = FALSE; + g_object_notify (G_OBJECT (model), "inverted-colors"); +} + gboolean ev_document_model_get_inverted_colors (EvDocumentModel *model) { diff --git a/libview/ev-document-model.h b/libview/ev-document-model.h index b8bea62c..f9d175c0 100644 --- a/libview/ev-document-model.h +++ b/libview/ev-document-model.h @@ -69,7 +69,9 @@ EvSizingMode ev_document_model_get_sizing_mode (EvDocumentModel *model); void ev_document_model_set_rotation (EvDocumentModel *model, gint rotation); gint ev_document_model_get_rotation (EvDocumentModel *model); -void ev_document_model_set_inverted_colors (EvDocumentModel *model, +void ev_document_model_set_inverted_colors (EvDocumentModel *model, + gboolean inverted_colors); +void atril_web_document_set_inverted_colors(EvDocumentModel *model, gboolean inverted_colors); gboolean ev_document_model_get_inverted_colors (EvDocumentModel *model); void ev_document_model_set_continuous (EvDocumentModel *model, diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index d8d3043d..76e183a1 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -568,6 +568,24 @@ ev_job_render_run (EvJob *job) ev_document_fc_mutex_lock (); ev_page = ev_document_get_page (job->document, job_render->page); + + if ( job->document->iswebdocument == TRUE ) + { + return TRUE; + + if (g_cancellable_is_cancelled (job->cancellable)) { + ev_document_fc_mutex_unlock (); + ev_document_doc_mutex_unlock (); + g_object_unref (rc); + + return FALSE; + } + + ev_document_fc_mutex_unlock (); + ev_document_doc_mutex_unlock (); + ev_job_succeeded (job); + return FALSE; + } rc = ev_render_context_new (ev_page, job_render->rotation, job_render->scale); g_object_unref (ev_page); -- cgit v1.2.1 From df43418e209ae9c98844185f789c63769ae9b3a2 Mon Sep 17 00:00:00 2001 From: rootavish Date: Mon, 7 Jul 2014 18:36:55 +0530 Subject: Refactored code, created a new EvWebView type Earlier my approach was to replace the atril view directly with a webview. However as it turned out it was extremely difficult to accomplish much tasks without the document-model. So I created an Extension of the WebKitWebView class, EvWebView so that now we can manipulate the webview as desired. Also having a separate file really helps in terms of clarity. Please note that there are many empty functions and TODO tags right now, I shall aim to fill these up once the display part is done, probably in this week. I also added some code on the backend to draw thumbnails when with GTK+-3.0, although I have never tested a GTK+-3.0 build.With GTK+-2.0 you won't get any build errors, however epub backend won't work right now. That being said, this commit is mostly because there was a lot of code that was lying in the local repository, and it was best to back it up as a failsafe. I modified ev-window to accomodate this new data structure, and having an equivalent ev_web_view function for every ev_view function, I can achieve most functionality by filling those functions with Webkit modules. Other than that on the backend Other than that there were some minor changes to the code. Although I did the above, currently I am not able to instantiate the EvWebView because of some class and object type definition errors, due to which I can't display the document. --- libview/Makefile.am | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'libview') diff --git a/libview/Makefile.am b/libview/Makefile.am index 7dd0a950..a5d28360 100644 --- a/libview/Makefile.am +++ b/libview/Makefile.am @@ -19,6 +19,7 @@ INST_H_SRC_FILES = \ ev-print-operation.h \ ev-stock-icons.h \ ev-view.h \ + ev-web-view.h \ ev-view-presentation.h INST_H_FILES = \ @@ -41,6 +42,7 @@ libatrilview_la_SOURCES = \ ev-timeline.c \ ev-transition-animation.c \ ev-view.c \ + ev-web-view.c \ ev-view-accessible.c \ ev-view-marshal.c \ ev-view-cursor.c \ @@ -63,6 +65,7 @@ libatrilview_la_CFLAGS = \ $(LIBVIEW_CFLAGS) \ $(WARN_CFLAGS) \ $(DISABLE_DEPRECATED) \ + $(WEBKIT_CFLAGS) \ $(AM_CFLAGS) libatrilview_la_LDFLAGS = \ @@ -73,7 +76,8 @@ libatrilview_la_LDFLAGS = \ libatrilview_la_LIBADD = \ $(top_builddir)/libdocument/libatrildocument.la \ - $(LIBVIEW_LIBS) + $(LIBVIEW_LIBS) \ + $(WEBKIT_CFLAGS) BUILT_SOURCES = \ ev-view-marshal.h \ -- cgit v1.2.1 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-jobs.c | 9 +- libview/ev-web-view.c | 349 ++++++++++++++++++++++++++++++++++++++++++++++++++ libview/ev-web-view.h | 64 +++++++++ 3 files changed, 420 insertions(+), 2 deletions(-) create mode 100644 libview/ev-web-view.c create mode 100644 libview/ev-web-view.h (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 76e183a1..7792fafa 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -211,7 +211,7 @@ ev_job_run (EvJob *job) { EvJobClass *class = EV_JOB_GET_CLASS (job); - return class->run (job); + return class-> run (job); } void @@ -791,7 +791,12 @@ ev_job_thumbnail_run (EvJob *job) ev_document_doc_mutex_lock (); page = ev_document_get_page (job->document, job_thumb->page); - rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale); + if (job->document->iswebdocument == TRUE ) { + rc = ev_render_context_new (page, 0, job_thumb->scale); + } + else { + rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale); + } g_object_unref (page); job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), 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) +{ + +} diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h new file mode 100644 index 00000000..6aaa17ff --- /dev/null +++ b/libview/ev-web-view.h @@ -0,0 +1,64 @@ +/* this file is part of atril, a mate document web_viewer + * + * Copyright (C) 2014 Avishkar Gupta + * Based on ev-view.h + * + * 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. + */ + +#if !defined (__EV_ATRIL_VIEW_H_INSIDE__) && !defined (ATRIL_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __EV_WEB_VIEW_H__ +#define __EV_WEB_VIEW_H__ + +#include + +#include + +#include "ev-document-model.h" +#include +G_BEGIN_DECLS + + +typedef struct _EvWebView EvWebView; +typedef struct _EvWebViewClass EvWebViewClass; + +#define EV_TYPE_WEB_VIEW (ev_web_view_get_type ()) +#define EV_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EV_TYPE_WEB_VIEW, EvWebView)) +#define EV_IS_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EV_TYPE_WEB_VIEW)) + +GType ev_web_view_get_type (void) G_GNUC_CONST; + +GtkWidget* ev_web_view_new (void); +void ev_web_view_set_model (EvWebView *webview, + EvDocumentModel *model); +void ev_web_view_reload (EvWebView *webview); + +/* Navigation */ +gboolean ev_web_view_next_page (EvWebView *webview); +gboolean ev_web_view_previous_page (EvWebView *webview); + +/*Sidebar links*/ +void ev_web_view_handle_link (EvWebView *webview, EvLink* link); + +/*Searching*/ +void ev_web_view_find_next (EvWebView *webview); +void ev_web_view_find_previous (EvWebView *webview); + +G_END_DECLS + +#endif /* __EV_WEB_VIEW_H__ */ -- cgit v1.2.1 From ec8233d30e8ac694381d42748cf8b08de077ec54 Mon Sep 17 00:00:00 2001 From: Stefano Karapetsas Date: Fri, 11 Jul 2014 22:22:55 +0200 Subject: libview: Fix makefile --- libview/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libview') diff --git a/libview/Makefile.am b/libview/Makefile.am index a5d28360..96e80ea3 100644 --- a/libview/Makefile.am +++ b/libview/Makefile.am @@ -77,7 +77,7 @@ libatrilview_la_LDFLAGS = \ libatrilview_la_LIBADD = \ $(top_builddir)/libdocument/libatrildocument.la \ $(LIBVIEW_LIBS) \ - $(WEBKIT_CFLAGS) + $(WEBKIT_LIBS) BUILT_SOURCES = \ ev-view-marshal.h \ -- 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-jobs.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++-- libview/ev-jobs.h | 30 +++++++++++- libview/ev-web-view.c | 14 ++++-- libview/ev-web-view.h | 5 +- 4 files changed, 171 insertions(+), 11 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 7792fafa..4f938a89 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -24,6 +24,7 @@ #include "ev-document-thumbnails.h" #include "ev-document-links.h" #include "ev-document-images.h" +#include "ev-job-scheduler.h" #include "ev-document-forms.h" #include "ev-file-exporter.h" #include "ev-document-factory.h" @@ -39,6 +40,14 @@ #include "ev-document-text.h" #include "ev-debug.h" +#include +#ifdef ENABLE_EPUB +#if GTK_CHECK_VERSION(3, 0, 0) +#include +#else +#include +#endif +#endif #include #include #include @@ -58,6 +67,8 @@ static void ev_job_page_data_init (EvJobPageData *job); static void ev_job_page_data_class_init (EvJobPageDataClass *class); static void ev_job_thumbnail_init (EvJobThumbnail *job); static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class); +static void ev_job_web_thumbnail_init (EvJobWebThumbnail *job); +static void ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class); static void ev_job_load_init (EvJobLoad *job); static void ev_job_load_class_init (EvJobLoadClass *class); static void ev_job_save_init (EvJobSave *job); @@ -87,6 +98,11 @@ enum { FIND_LAST_SIGNAL }; +typedef struct _WebKitScreenShot { + cairo_surface_t *surface; + gboolean completed; +}WebKitScreenShot; + static guint job_signals[LAST_SIGNAL] = { 0 }; static guint job_fonts_signals[FONTS_LAST_SIGNAL] = { 0 }; static guint job_find_signals[FIND_LAST_SIGNAL] = { 0 }; @@ -98,6 +114,7 @@ G_DEFINE_TYPE (EvJobAnnots, ev_job_annots, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobPageData, ev_job_page_data, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB) +G_DEFINE_TYPE (EvJobWebThumbnail, ev_job_web_thumbnail, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobFonts, ev_job_fonts, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobSave, ev_job_save, EV_TYPE_JOB) @@ -758,7 +775,7 @@ ev_job_page_data_new (EvDocument *document, static void ev_job_thumbnail_init (EvJobThumbnail *job) { - EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD; + EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD; } static void @@ -784,10 +801,10 @@ ev_job_thumbnail_run (EvJob *job) EvJobThumbnail *job_thumb = EV_JOB_THUMBNAIL (job); EvRenderContext *rc; EvPage *page; - + GtkWidget *webview; ev_debug_message (DEBUG_JOBS, "%d (%p)", job_thumb->page, job); ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); - + ev_document_doc_mutex_lock (); page = ev_document_get_page (job->document, job_thumb->page); @@ -799,13 +816,38 @@ ev_job_thumbnail_run (EvJob *job) } g_object_unref (page); + if (job->document->iswebdocument == TRUE) { + webview = ev_document_thumbnails_get_webview_with_rendered_document(EV_DOCUMENT_THUMBNAILS(job->document),(gchar*)rc->page->backend_page); + gboolean completed = FALSE; + + EvJobWebThumbnail *web_thumb_job = + EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, webview, &completed)); + + ev_job_scheduler_push_job (EV_JOB (web_thumb_job), EV_JOB_PRIORITY_HIGH); + + while (completed == FALSE) { + /*Let the job complete before we proceed. + *This fix SHOULD solve all problems. + */ + } + + /* For the purpose of thumbnails only, we make the page a cairo surface, instead of the uri's we are passing around*/ + EvPage *screenshotpage; + screenshotpage = ev_page_new(rc->page->index); + screenshotpage->backend_page = (EvBackendPage)web_thumb_job->surface; + screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ; + ev_render_context_set_page(rc,screenshotpage); + + g_object_unref(web_thumb_job); + } + job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), rc, TRUE); g_object_unref (rc); ev_document_doc_mutex_unlock (); ev_job_succeeded (job); - + return FALSE; } @@ -839,6 +881,89 @@ ev_job_thumbnail_new (EvDocument *document, return EV_JOB (job); } +/* This job is a part of thumbnails, but will run as a thread and call the otherwise main loop job on a signal*/ +/* EvJobWebThumbnail */ +static void +ev_job_web_thumbnail_init (EvJobWebThumbnail *job) +{ + EV_JOB (job)->run_mode = EV_JOB_RUN_MAIN_LOOP; +} + +static void +ev_job_web_thumbnail_dispose (GObject *object) +{ + EvJobWebThumbnail *job; + + job = EV_JOB_WEB_THUMBNAIL (object); + + ev_debug_message (DEBUG_JOBS, "%d (%p)", job->page, job); + + if(job->webview) { + g_object_unref(job->webview); + job->webview = NULL; + } + + if(job->offscreenwindow) { + gtk_widget_destroy(job->offscreenwindow); + job->offscreenwindow = NULL; + } + + if(job->surface) { + cairo_surface_destroy (job->surface); + job->surface = NULL; + } + (* G_OBJECT_CLASS (ev_job_web_thumbnail_parent_class)->dispose) (object); +} + +static gboolean +ev_job_web_thumbnail_run (EvJob *job) +{ + EvJobWebThumbnail *web_thumb_job = EV_JOB_WEB_THUMBNAIL(job); + gtk_window_set_default_size (GTK_WINDOW(web_thumb_job->offscreenwindow),800,1080); + gtk_container_add(GTK_CONTAINER(web_thumb_job->offscreenwindow),GTK_WIDGET(web_thumb_job->webview)); + gtk_widget_show_all(web_thumb_job->offscreenwindow); + + web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(web_thumb_job->webview)); + + while (!web_thumb_job->surface) { + /* Wait for a surface */ + } + *(web_thumb_job->completed) = TRUE ; + + ev_job_succeeded (job); + + return FALSE; +} + +static void +ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class) +{ + GObjectClass *oclass = G_OBJECT_CLASS (class); + EvJobClass *job_class = EV_JOB_CLASS (class); + + oclass->dispose = ev_job_web_thumbnail_dispose; + job_class->run = ev_job_web_thumbnail_run; +} + +EvJob * +ev_job_web_thumbnail_new (EvDocument *document, + GtkWidget *webview, + gboolean *completed) +{ + EvJobWebThumbnail *job; + + ev_debug_message (DEBUG_JOBS, "%d", page); + + job = g_object_new (EV_TYPE_JOB_WEB_THUMBNAIL, NULL); + + EV_JOB (job)->document = g_object_ref (document); + job->webview = g_object_ref(webview); + job->completed = completed; + job->offscreenwindow = gtk_offscreen_window_new(); + job->surface = NULL; + return EV_JOB (job); +} + /* EvJobFonts */ static void ev_job_fonts_init (EvJobFonts *job) diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index e6ae4552..8924a129 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -45,6 +45,9 @@ typedef struct _EvJobPageDataClass EvJobPageDataClass; typedef struct _EvJobThumbnail EvJobThumbnail; typedef struct _EvJobThumbnailClass EvJobThumbnailClass; +typedef struct _EvJobWebThumbnail EvJobWebThumbnail; +typedef struct _EvJobWebThumbnailClass EvJobWebThumbnailClass; + typedef struct _EvJobLinks EvJobLinks; typedef struct _EvJobLinksClass EvJobLinksClass; @@ -111,6 +114,11 @@ typedef struct _EvJobPrintClass EvJobPrintClass; #define EV_JOB_THUMBNAIL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_THUMBNAIL, EvJobThumbnailClass)) #define EV_IS_JOB_THUMBNAIL(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_THUMBNAIL)) +#define EV_TYPE_JOB_WEB_THUMBNAIL (ev_job_web_thumbnail_get_type()) +#define EV_JOB_WEB_THUMBNAIL(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_WEB_THUMBNAIL, EvJobWebThumbnail)) +#define EV_JOB_WEB_THUMBNAIL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_WEB_THUMBNAIL, EvJobWebThumbnailClass)) +#define EV_IS_JOB_WEB_THUMBNAIL(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_WEB_THUMBNAIL)) + #define EV_TYPE_JOB_FONTS (ev_job_fonts_get_type()) #define EV_JOB_FONTS(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_FONTS, EvJobFonts)) #define EV_JOB_FONTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_FONTS, EvJobFontsClass)) @@ -281,11 +289,9 @@ struct _EvJobPageDataClass struct _EvJobThumbnail { EvJob parent; - gint page; gint rotation; gdouble scale; - GdkPixbuf *thumbnail; }; @@ -294,6 +300,20 @@ struct _EvJobThumbnailClass EvJobClass parent_class; }; +struct _EvJobWebThumbnail +{ + EvJob parent; + GtkWidget *webview; + GtkWidget *offscreenwindow; + gboolean *completed; + cairo_surface_t *surface; +}; + +struct _EvJobWebThumbnailClass +{ + EvJobClass parent_class; +}; + struct _EvJobFonts { EvJob parent; @@ -450,6 +470,12 @@ EvJob *ev_job_thumbnail_new (EvDocument *document, gint page, gint rotation, gdouble scale); + +/* EvJobWebThumbnail */ +GType ev_job_web_thumbnail_get_type (void) G_GNUC_CONST; +EvJob *ev_job_web_thumbnail_new (EvDocument *document, + GtkWidget *webview, + gboolean *completed); /* EvJobFonts */ GType ev_job_fonts_get_type (void) G_GNUC_CONST; EvJob *ev_job_fonts_new (EvDocument *document); 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; diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 6aaa17ff..55736871 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -47,7 +47,10 @@ GtkWidget* ev_web_view_new (void); void ev_web_view_set_model (EvWebView *webview, EvDocumentModel *model); void ev_web_view_reload (EvWebView *webview); - +void +ev_web_view_reload_page (EvWebView *webview, + gint page); + /* Navigation */ gboolean ev_web_view_next_page (EvWebView *webview); gboolean ev_web_view_previous_page (EvWebView *webview); -- cgit v1.2.1 From e0535b0e61cc56ec62d32518c03a42836f5256e6 Mon Sep 17 00:00:00 2001 From: rootavish Date: Sat, 19 Jul 2014 22:18:40 +0530 Subject: Moving all webkit tasks to main loop jobs --- libview/ev-jobs.c | 74 ++++++++++++++++++++++++++++++++++++------------------- libview/ev-jobs.h | 4 ++- 2 files changed, 51 insertions(+), 27 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 4f938a89..4596b58a 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -801,7 +801,6 @@ ev_job_thumbnail_run (EvJob *job) EvJobThumbnail *job_thumb = EV_JOB_THUMBNAIL (job); EvRenderContext *rc; EvPage *page; - GtkWidget *webview; ev_debug_message (DEBUG_JOBS, "%d (%p)", job_thumb->page, job); ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); @@ -817,20 +816,24 @@ ev_job_thumbnail_run (EvJob *job) g_object_unref (page); if (job->document->iswebdocument == TRUE) { - webview = ev_document_thumbnails_get_webview_with_rendered_document(EV_DOCUMENT_THUMBNAILS(job->document),(gchar*)rc->page->backend_page); gboolean completed = FALSE; - + GtkWidget *webview = webkit_web_view_new(); + EvJobWebThumbnail *web_thumb_job = - EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, webview, &completed)); + EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, webview, (gchar*)rc->page->backend_page)); ev_job_scheduler_push_job (EV_JOB (web_thumb_job), EV_JOB_PRIORITY_HIGH); + + WebKitLoadStatus status ; - while (completed == FALSE) { + while ((status = webkit_web_view_get_load_status (WEBKIT_WEB_VIEW(webview))) != WEBKIT_LOAD_FINISHED && + status != WEBKIT_LOAD_FAILED) { /*Let the job complete before we proceed. *This fix SHOULD solve all problems. */ } - + + web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); /* For the purpose of thumbnails only, we make the page a cairo surface, instead of the uri's we are passing around*/ EvPage *screenshotpage; screenshotpage = ev_page_new(rc->page->index); @@ -838,11 +841,15 @@ ev_job_thumbnail_run (EvJob *job) screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ; ev_render_context_set_page(rc,screenshotpage); + job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), + rc, TRUE); + g_object_unref(web_thumb_job); } - - job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), - rc, TRUE); + else { + job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), + rc, TRUE); + } g_object_unref (rc); ev_document_doc_mutex_unlock (); @@ -897,21 +904,25 @@ ev_job_web_thumbnail_dispose (GObject *object) job = EV_JOB_WEB_THUMBNAIL (object); ev_debug_message (DEBUG_JOBS, "%d (%p)", job->page, job); - - if(job->webview) { - g_object_unref(job->webview); - job->webview = NULL; - } if(job->offscreenwindow) { gtk_widget_destroy(job->offscreenwindow); job->offscreenwindow = NULL; } - + + if(job->webview) { + job->webview = NULL; + } + if(job->surface) { cairo_surface_destroy (job->surface); job->surface = NULL; } + + if(job->page) { + g_free(job->page); + job->page = NULL; + } (* G_OBJECT_CLASS (ev_job_web_thumbnail_parent_class)->dispose) (object); } @@ -919,19 +930,23 @@ static gboolean ev_job_web_thumbnail_run (EvJob *job) { EvJobWebThumbnail *web_thumb_job = EV_JOB_WEB_THUMBNAIL(job); + + ev_debug_message (DEBUG_JOBS, "%s (%p)", web_thumb_job->page, job); + +#ifdef EV_ENABLE_DEBUG + /* We use the #ifdef in this case because of the if */ + if (web_thumb_job->surface == NULL) + ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); +#endif + gtk_window_set_default_size (GTK_WINDOW(web_thumb_job->offscreenwindow),800,1080); - gtk_container_add(GTK_CONTAINER(web_thumb_job->offscreenwindow),GTK_WIDGET(web_thumb_job->webview)); + + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_thumb_job->webview),web_thumb_job->page); + gtk_widget_show_all(web_thumb_job->offscreenwindow); - web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(web_thumb_job->webview)); + ev_job_succeeded (EV_JOB(job)); - while (!web_thumb_job->surface) { - /* Wait for a surface */ - } - *(web_thumb_job->completed) = TRUE ; - - ev_job_succeeded (job); - return FALSE; } @@ -947,8 +962,9 @@ ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class) EvJob * ev_job_web_thumbnail_new (EvDocument *document, + gboolean *completed, GtkWidget *webview, - gboolean *completed) + gchar *webpage) { EvJobWebThumbnail *job; @@ -957,10 +973,16 @@ ev_job_web_thumbnail_new (EvDocument *document, job = g_object_new (EV_TYPE_JOB_WEB_THUMBNAIL, NULL); EV_JOB (job)->document = g_object_ref (document); - job->webview = g_object_ref(webview); + + job->webview = webview; job->completed = completed; job->offscreenwindow = gtk_offscreen_window_new(); + + gtk_container_add(GTK_CONTAINER(job->offscreenwindow),GTK_WIDGET(job->webview)); + job->surface = NULL; + job->page = g_strdup(webpage); + return EV_JOB (job); } diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index 8924a129..a45891b6 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -307,6 +307,7 @@ struct _EvJobWebThumbnail GtkWidget *offscreenwindow; gboolean *completed; cairo_surface_t *surface; + gchar* page; }; struct _EvJobWebThumbnailClass @@ -474,8 +475,9 @@ EvJob *ev_job_thumbnail_new (EvDocument *document, /* EvJobWebThumbnail */ GType ev_job_web_thumbnail_get_type (void) G_GNUC_CONST; EvJob *ev_job_web_thumbnail_new (EvDocument *document, + gboolean *completed, GtkWidget *webview, - gboolean *completed); + gchar *webpage); /* EvJobFonts */ GType ev_job_fonts_get_type (void) G_GNUC_CONST; EvJob *ev_job_fonts_new (EvDocument *document); -- 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-jobs.c | 2 +- libview/ev-web-view.c | 6 ++++++ libview/ev-web-view.h | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 4596b58a..44881516 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -968,7 +968,7 @@ ev_job_web_thumbnail_new (EvDocument *document, { EvJobWebThumbnail *job; - ev_debug_message (DEBUG_JOBS, "%d", page); + ev_debug_message (DEBUG_JOBS, "%s", webpage); job = g_object_new (EV_TYPE_JOB_WEB_THUMBNAIL, NULL); 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 diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 55736871..19d6c8a1 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -62,6 +62,9 @@ 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); +/*Selection*/ +gboolean ev_web_view_get_has_selection (EvWebView *webview); + G_END_DECLS #endif /* __EV_WEB_VIEW_H__ */ -- cgit v1.2.1 From c8b63e55987f0ee6d4067a7309ef2fac8119b0cc Mon Sep 17 00:00:00 2001 From: rootavish Date: Sun, 20 Jul 2014 23:57:08 +0530 Subject: Moving everything related to webkit to main thread jobs Including creation of windows, webviews etc., still get a crash. The one page epub works fine with the thumbnails though. Also fixing some calls which cause gtk-critical errors when I try to close the window. --- libview/ev-jobs.c | 56 ++++++++++++++++++++++++++++++++++--------------------- libview/ev-jobs.h | 2 +- 2 files changed, 36 insertions(+), 22 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 44881516..8a9f6727 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -817,23 +817,15 @@ ev_job_thumbnail_run (EvJob *job) if (job->document->iswebdocument == TRUE) { gboolean completed = FALSE; - GtkWidget *webview = webkit_web_view_new(); EvJobWebThumbnail *web_thumb_job = - EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, webview, (gchar*)rc->page->backend_page)); + EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, (gchar*)rc->page->backend_page)); ev_job_scheduler_push_job (EV_JOB (web_thumb_job), EV_JOB_PRIORITY_HIGH); - WebKitLoadStatus status ; - - while ((status = webkit_web_view_get_load_status (WEBKIT_WEB_VIEW(webview))) != WEBKIT_LOAD_FINISHED && - status != WEBKIT_LOAD_FAILED) { - /*Let the job complete before we proceed. - *This fix SHOULD solve all problems. - */ + while (completed == FALSE) { + /* Let the job complete*/ } - - web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); /* For the purpose of thumbnails only, we make the page a cairo surface, instead of the uri's we are passing around*/ EvPage *screenshotpage; screenshotpage = ev_page_new(rc->page->index); @@ -903,7 +895,7 @@ ev_job_web_thumbnail_dispose (GObject *object) job = EV_JOB_WEB_THUMBNAIL (object); - ev_debug_message (DEBUG_JOBS, "%d (%p)", job->page, job); + ev_debug_message (DEBUG_JOBS, "%s (%p)", job->page, job); if(job->offscreenwindow) { gtk_widget_destroy(job->offscreenwindow); @@ -923,14 +915,41 @@ ev_job_web_thumbnail_dispose (GObject *object) g_free(job->page); job->page = NULL; } + + if (&job->screenlock) + { + g_rw_lock_clear (&job->screenlock); + } (* G_OBJECT_CLASS (ev_job_web_thumbnail_parent_class)->dispose) (object); } +static void +web_thumbnail_get_screenshot_cb(WebKitWebView *webview, + GParamSpec *spec, + EvJobWebThumbnail *web_thumb_job) +{ + WebKitLoadStatus status = webkit_web_view_get_load_status(webview); + + if (status == WEBKIT_LOAD_FINISHED) { + g_rw_lock_writer_unlock (&web_thumb_job->screenlock); + g_rw_lock_reader_trylock (&web_thumb_job->screenlock); + web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); + g_rw_lock_reader_unlock (&web_thumb_job->screenlock); + *(web_thumb_job->completed) = TRUE; + } +} + static gboolean ev_job_web_thumbnail_run (EvJob *job) { EvJobWebThumbnail *web_thumb_job = EV_JOB_WEB_THUMBNAIL(job); + web_thumb_job->webview = webkit_web_view_new(); + web_thumb_job->offscreenwindow = gtk_offscreen_window_new(); + gtk_container_add(GTK_CONTAINER(web_thumb_job->offscreenwindow),GTK_WIDGET(web_thumb_job->webview)); + + gtk_window_set_default_size (GTK_WINDOW(web_thumb_job->offscreenwindow),800,1080); + ev_debug_message (DEBUG_JOBS, "%s (%p)", web_thumb_job->page, job); #ifdef EV_ENABLE_DEBUG @@ -939,10 +958,10 @@ ev_job_web_thumbnail_run (EvJob *job) ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); #endif - gtk_window_set_default_size (GTK_WINDOW(web_thumb_job->offscreenwindow),800,1080); - + + g_rw_lock_writer_trylock (&web_thumb_job->screenlock); webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_thumb_job->webview),web_thumb_job->page); - + g_signal_connect(WEBKIT_WEB_VIEW(web_thumb_job->webview),"notify::load-status",G_CALLBACK(web_thumbnail_get_screenshot_cb),web_thumb_job); gtk_widget_show_all(web_thumb_job->offscreenwindow); ev_job_succeeded (EV_JOB(job)); @@ -963,7 +982,6 @@ ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class) EvJob * ev_job_web_thumbnail_new (EvDocument *document, gboolean *completed, - GtkWidget *webview, gchar *webpage) { EvJobWebThumbnail *job; @@ -974,15 +992,11 @@ ev_job_web_thumbnail_new (EvDocument *document, EV_JOB (job)->document = g_object_ref (document); - job->webview = webview; job->completed = completed; - job->offscreenwindow = gtk_offscreen_window_new(); - - gtk_container_add(GTK_CONTAINER(job->offscreenwindow),GTK_WIDGET(job->webview)); job->surface = NULL; job->page = g_strdup(webpage); - + g_rw_lock_init (&job->screenlock); return EV_JOB (job); } diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index a45891b6..ded0f05f 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -306,6 +306,7 @@ struct _EvJobWebThumbnail GtkWidget *webview; GtkWidget *offscreenwindow; gboolean *completed; + GRWLock screenlock; cairo_surface_t *surface; gchar* page; }; @@ -476,7 +477,6 @@ EvJob *ev_job_thumbnail_new (EvDocument *document, GType ev_job_web_thumbnail_get_type (void) G_GNUC_CONST; EvJob *ev_job_web_thumbnail_new (EvDocument *document, gboolean *completed, - GtkWidget *webview, gchar *webpage); /* EvJobFonts */ GType ev_job_fonts_get_type (void) G_GNUC_CONST; -- cgit v1.2.1 From b1bed03353e98b968e3f371446b02837f9e3baf7 Mon Sep 17 00:00:00 2001 From: rootavish Date: Mon, 21 Jul 2014 19:22:22 +0530 Subject: Program no longer segfaults, but does not give thumbnails The loading icons for all thumbnails are displayed, but the program does not segfault. Also realized that the absurd resizing of the window was due to the ephy-zoom action on the webview window. Will fix that in the next commit. Will also think of some workaround for screenshots. For now committed this code so that this can act as a clean slate if I screw up somewhere. --- libview/ev-jobs.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 8a9f6727..89807474 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -98,10 +98,8 @@ enum { FIND_LAST_SIGNAL }; -typedef struct _WebKitScreenShot { - cairo_surface_t *surface; - gboolean completed; -}WebKitScreenShot; +static GtkWidget* webview; +static GtkWidget* offscreenwindow; static guint job_signals[LAST_SIGNAL] = { 0 }; static guint job_fonts_signals[FONTS_LAST_SIGNAL] = { 0 }; @@ -924,18 +922,17 @@ ev_job_web_thumbnail_dispose (GObject *object) } static void -web_thumbnail_get_screenshot_cb(WebKitWebView *webview, - GParamSpec *spec, +web_thumbnail_get_screenshot_cb(WebKitWebView *webview, + WebKitWebFrame *webframe, EvJobWebThumbnail *web_thumb_job) { WebKitLoadStatus status = webkit_web_view_get_load_status(webview); if (status == WEBKIT_LOAD_FINISHED) { - g_rw_lock_writer_unlock (&web_thumb_job->screenlock); - g_rw_lock_reader_trylock (&web_thumb_job->screenlock); web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); - g_rw_lock_reader_unlock (&web_thumb_job->screenlock); - *(web_thumb_job->completed) = TRUE; + if (web_thumb_job->surface) { + *(web_thumb_job->completed) = TRUE; + } } } @@ -943,12 +940,17 @@ static gboolean ev_job_web_thumbnail_run (EvJob *job) { EvJobWebThumbnail *web_thumb_job = EV_JOB_WEB_THUMBNAIL(job); + if (!webview) { + webview = webkit_web_view_new(); + } + + if (!offscreenwindow) { + offscreenwindow = gtk_offscreen_window_new(); + + gtk_container_add(GTK_CONTAINER(offscreenwindow),GTK_WIDGET(webview)); - web_thumb_job->webview = webkit_web_view_new(); - web_thumb_job->offscreenwindow = gtk_offscreen_window_new(); - gtk_container_add(GTK_CONTAINER(web_thumb_job->offscreenwindow),GTK_WIDGET(web_thumb_job->webview)); - - gtk_window_set_default_size (GTK_WINDOW(web_thumb_job->offscreenwindow),800,1080); + gtk_window_set_default_size (GTK_WINDOW(offscreenwindow),800,1080); + } ev_debug_message (DEBUG_JOBS, "%s (%p)", web_thumb_job->page, job); @@ -958,11 +960,9 @@ ev_job_web_thumbnail_run (EvJob *job) ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); #endif - - g_rw_lock_writer_trylock (&web_thumb_job->screenlock); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_thumb_job->webview),web_thumb_job->page); - g_signal_connect(WEBKIT_WEB_VIEW(web_thumb_job->webview),"notify::load-status",G_CALLBACK(web_thumbnail_get_screenshot_cb),web_thumb_job); - gtk_widget_show_all(web_thumb_job->offscreenwindow); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),web_thumb_job->page); + g_signal_connect(WEBKIT_WEB_VIEW(webview),"document-load-finished",G_CALLBACK(web_thumbnail_get_screenshot_cb),web_thumb_job); + gtk_widget_show_all(offscreenwindow); ev_job_succeeded (EV_JOB(job)); -- cgit v1.2.1 From 529473758fee66ac2fb0f2c89e4298789d183d5b Mon Sep 17 00:00:00 2001 From: rootavish Date: Mon, 21 Jul 2014 23:49:08 +0530 Subject: Thumbnails working for all epub documents. Passes the test with a 71 page epub, I don't think it would have much problems were we to scale it further. --- libview/ev-jobs.c | 39 ++++++++++++++++----------------------- libview/ev-jobs.h | 5 +++-- 2 files changed, 19 insertions(+), 25 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 89807474..38fe6a0f 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -815,9 +815,9 @@ ev_job_thumbnail_run (EvJob *job) if (job->document->iswebdocument == TRUE) { gboolean completed = FALSE; - + cairo_surface_t *surface = NULL ; EvJobWebThumbnail *web_thumb_job = - EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, (gchar*)rc->page->backend_page)); + EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, (gchar*)rc->page->backend_page,&surface)); ev_job_scheduler_push_job (EV_JOB (web_thumb_job), EV_JOB_PRIORITY_HIGH); @@ -827,7 +827,7 @@ ev_job_thumbnail_run (EvJob *job) /* For the purpose of thumbnails only, we make the page a cairo surface, instead of the uri's we are passing around*/ EvPage *screenshotpage; screenshotpage = ev_page_new(rc->page->index); - screenshotpage->backend_page = (EvBackendPage)web_thumb_job->surface; + screenshotpage->backend_page = (EvBackendPage)surface; screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ; ev_render_context_set_page(rc,screenshotpage); @@ -835,6 +835,7 @@ ev_job_thumbnail_run (EvJob *job) rc, TRUE); g_object_unref(web_thumb_job); + g_object_unref(screenshotpage); } else { job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), @@ -903,11 +904,6 @@ ev_job_web_thumbnail_dispose (GObject *object) if(job->webview) { job->webview = NULL; } - - if(job->surface) { - cairo_surface_destroy (job->surface); - job->surface = NULL; - } if(job->page) { g_free(job->page); @@ -926,14 +922,11 @@ web_thumbnail_get_screenshot_cb(WebKitWebView *webview, WebKitWebFrame *webframe, EvJobWebThumbnail *web_thumb_job) { - WebKitLoadStatus status = webkit_web_view_get_load_status(webview); - - if (status == WEBKIT_LOAD_FINISHED) { - web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); - if (web_thumb_job->surface) { - *(web_thumb_job->completed) = TRUE; - } - } + *(web_thumb_job->surface) = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); + if (*(web_thumb_job->surface)) { + //TODO : what if you don't get one? + *(web_thumb_job->completed) = TRUE; + } } static gboolean @@ -950,6 +943,8 @@ ev_job_web_thumbnail_run (EvJob *job) gtk_container_add(GTK_CONTAINER(offscreenwindow),GTK_WIDGET(webview)); gtk_window_set_default_size (GTK_WINDOW(offscreenwindow),800,1080); + + gtk_widget_show_all(offscreenwindow); } ev_debug_message (DEBUG_JOBS, "%s (%p)", web_thumb_job->page, job); @@ -961,11 +956,8 @@ ev_job_web_thumbnail_run (EvJob *job) #endif webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),web_thumb_job->page); - g_signal_connect(WEBKIT_WEB_VIEW(webview),"document-load-finished",G_CALLBACK(web_thumbnail_get_screenshot_cb),web_thumb_job); - gtk_widget_show_all(offscreenwindow); - - ev_job_succeeded (EV_JOB(job)); - + g_signal_connect(WEBKIT_WEB_VIEW(webview),"document-load-finished",G_CALLBACK(web_thumbnail_get_screenshot_cb),EV_JOB_WEB_THUMBNAIL(job)); + ev_job_succeeded (EV_JOB(web_thumb_job)); return FALSE; } @@ -982,7 +974,8 @@ ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class) EvJob * ev_job_web_thumbnail_new (EvDocument *document, gboolean *completed, - gchar *webpage) + gchar *webpage, + cairo_surface_t **surface) { EvJobWebThumbnail *job; @@ -994,7 +987,7 @@ ev_job_web_thumbnail_new (EvDocument *document, job->completed = completed; - job->surface = NULL; + job->surface = surface; job->page = g_strdup(webpage); g_rw_lock_init (&job->screenlock); return EV_JOB (job); diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index ded0f05f..39fa4433 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -307,7 +307,7 @@ struct _EvJobWebThumbnail GtkWidget *offscreenwindow; gboolean *completed; GRWLock screenlock; - cairo_surface_t *surface; + cairo_surface_t **surface; gchar* page; }; @@ -477,7 +477,8 @@ EvJob *ev_job_thumbnail_new (EvDocument *document, GType ev_job_web_thumbnail_get_type (void) G_GNUC_CONST; EvJob *ev_job_web_thumbnail_new (EvDocument *document, gboolean *completed, - gchar *webpage); + gchar *webpage, + cairo_surface_t **surface); /* EvJobFonts */ GType ev_job_fonts_get_type (void) G_GNUC_CONST; EvJob *ev_job_fonts_new (EvDocument *document); -- 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-jobs.c | 21 ++++----------------- libview/ev-web-view.c | 6 ++++++ libview/ev-web-view.h | 1 + 3 files changed, 11 insertions(+), 17 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 38fe6a0f..884baabc 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -896,24 +896,11 @@ ev_job_web_thumbnail_dispose (GObject *object) ev_debug_message (DEBUG_JOBS, "%s (%p)", job->page, job); - if(job->offscreenwindow) { - gtk_widget_destroy(job->offscreenwindow); - job->offscreenwindow = NULL; - } - - if(job->webview) { - job->webview = NULL; - } - if(job->page) { g_free(job->page); job->page = NULL; } - if (&job->screenlock) - { - g_rw_lock_clear (&job->screenlock); - } (* G_OBJECT_CLASS (ev_job_web_thumbnail_parent_class)->dispose) (object); } @@ -972,9 +959,9 @@ ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class) } EvJob * -ev_job_web_thumbnail_new (EvDocument *document, - gboolean *completed, - gchar *webpage, +ev_job_web_thumbnail_new (EvDocument *document, + gboolean *completed, + gchar *webpage, cairo_surface_t **surface) { EvJobWebThumbnail *job; @@ -989,7 +976,7 @@ ev_job_web_thumbnail_new (EvDocument *document, job->surface = surface; job->page = g_strdup(webpage); - g_rw_lock_init (&job->screenlock); + return EV_JOB (job); } 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 diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 19d6c8a1..eaa2ef3f 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -64,6 +64,7 @@ void ev_web_view_find_previous (EvWebView *webview); /*Selection*/ gboolean ev_web_view_get_has_selection (EvWebView *webview); +void ev_web_view_select_all (EvWebView *webview); G_END_DECLS -- 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 ++++++++++++ libview/ev-web-view.h | 4 ++++ 2 files changed, 16 insertions(+) (limited to 'libview') 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 diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index eaa2ef3f..ac957f5d 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -66,6 +66,10 @@ void ev_web_view_find_previous (EvWebView *webview); gboolean ev_web_view_get_has_selection (EvWebView *webview); void ev_web_view_select_all (EvWebView *webview); +/*Zoom control*/ +gboolean ev_web_view_zoom_in (EvWebView *webview); +gboolean ev_web_view_zoom_out (EvWebView *webview); + G_END_DECLS #endif /* __EV_WEB_VIEW_H__ */ -- 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') 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 +++++++++++++++++++------- libview/ev-web-view.h | 9 +++++---- 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'libview') 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) { diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index ac957f5d..2c920434 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -1,7 +1,7 @@ -/* this file is part of atril, a mate document web_viewer +/* this file is part of atril, a mate document viewer * * Copyright (C) 2014 Avishkar Gupta - * Based on ev-view.h + * Based on ev-view.h, 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 @@ -63,8 +63,9 @@ void ev_web_view_find_next (EvWebView *webview); void ev_web_view_find_previous (EvWebView *webview); /*Selection*/ -gboolean ev_web_view_get_has_selection (EvWebView *webview); -void ev_web_view_select_all (EvWebView *webview); +gboolean ev_web_view_get_has_selection (EvWebView *webview); +void ev_web_view_select_all (EvWebView *webview); +void ev_web_view_copy (EvWebView *webview); /*Zoom control*/ 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-document-model.c | 11 +---- libview/ev-jobs.c | 40 ++++++++++++--- libview/ev-jobs.h | 1 + libview/ev-web-view.c | 117 +++++++++++++++++++++++++++++++++++++++++++- libview/ev-web-view.h | 27 ++++++---- 5 files changed, 167 insertions(+), 29 deletions(-) (limited to 'libview') diff --git a/libview/ev-document-model.c b/libview/ev-document-model.c index 00ce782b..dbf0477f 100644 --- a/libview/ev-document-model.c +++ b/libview/ev-document-model.c @@ -106,15 +106,8 @@ ev_document_model_set_property (GObject *object, ev_document_model_set_page (model, g_value_get_int (value)); break; case PROP_ROTATION: - { - if ( model->document->iswebdocument == TRUE ) { - model->rotation=0; - } - else { - ev_document_model_set_rotation (model, g_value_get_int (value)); - } - break; - } + ev_document_model_set_rotation (model, g_value_get_int (value)); + break; case PROP_INVERTED_COLORS: if ( model->document->iswebdocument == TRUE ) { atril_web_document_set_inverted_colors(model,g_value_get_boolean(value)); diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 884baabc..155990e9 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -1349,6 +1349,10 @@ ev_job_find_dispose (GObject *object) g_free (job->pages); job->pages = NULL; } + + if (job->results) { + g_free(job->results); + } (* G_OBJECT_CLASS (ev_job_find_parent_class)->dispose) (object); } @@ -1360,7 +1364,6 @@ ev_job_find_run (EvJob *job) EvDocumentFind *find = EV_DOCUMENT_FIND (job->document); EvPage *ev_page; GList *matches; - ev_debug_message (DEBUG_JOBS, NULL); /* Do not block the main loop */ @@ -1374,16 +1377,26 @@ ev_job_find_run (EvJob *job) #endif ev_page = ev_document_get_page (job->document, job_find->current_page); - matches = ev_document_find_find_text (find, ev_page, job_find->text, - job_find->case_sensitive); + + if (job->document->iswebdocument) { + job_find->has_results = ev_document_find_check_for_hits(find, ev_page, job_find->text, + job_find->case_sensitive); + }else { + matches = ev_document_find_find_text (find, ev_page, job_find->text, + job_find->case_sensitive); + } + g_object_unref (ev_page); ev_document_doc_mutex_unlock (); - if (!job_find->has_results) + if (!job_find->has_results && !job->document->iswebdocument) { job_find->has_results = (matches != NULL); - - job_find->pages[job_find->current_page] = matches; + } + + if (job->document->iswebdocument == FALSE) { + job_find->pages[job_find->current_page] = matches; + } g_signal_emit (job_find, job_find_signals[FIND_UPDATED], 0, job_find->current_page); job_find->current_page = (job_find->current_page + 1) % job_find->n_pages; @@ -1433,7 +1446,13 @@ ev_job_find_new (EvDocument *document, job->start_page = start_page; job->current_page = start_page; job->n_pages = n_pages; - job->pages = g_new0 (GList *, n_pages); + + if (document->iswebdocument) { + job->results = g_malloc0 (sizeof(guint) *n_pages); + } + else { + job->pages = g_new0 (GList *, n_pages); + } job->text = g_strdup (text); job->case_sensitive = case_sensitive; job->has_results = FALSE; @@ -1445,7 +1464,12 @@ gint ev_job_find_get_n_results (EvJobFind *job, gint page) { - return g_list_length (job->pages[page]); + if (EV_JOB(job)->document->iswebdocument) { + return job->results[page]; + } + else { + return g_list_length (job->pages[page]); + } } gdouble diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index 39fa4433..87365672 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -365,6 +365,7 @@ struct _EvJobFind gint current_page; gint n_pages; GList **pages; + guint *results; gchar *text; gboolean case_sensitive; gboolean has_results; 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) { diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 2c920434..aa2d5492 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -28,7 +28,7 @@ #include #include - +#include "ev-jobs.h" #include "ev-document-model.h" #include G_BEGIN_DECLS @@ -44,30 +44,37 @@ typedef struct _EvWebViewClass EvWebViewClass; GType ev_web_view_get_type (void) G_GNUC_CONST; GtkWidget* ev_web_view_new (void); + void ev_web_view_set_model (EvWebView *webview, EvDocumentModel *model); -void ev_web_view_reload (EvWebView *webview); -void -ev_web_view_reload_page (EvWebView *webview, + +void ev_web_view_reload (EvWebView *webview); + +void ev_web_view_reload_page (EvWebView *webview, gint page); /* Navigation */ gboolean ev_web_view_next_page (EvWebView *webview); gboolean ev_web_view_previous_page (EvWebView *webview); -/*Sidebar links*/ +/* Sidebar links */ void ev_web_view_handle_link (EvWebView *webview, EvLink* link); -/*Searching*/ -void ev_web_view_find_next (EvWebView *webview); -void ev_web_view_find_previous (EvWebView *webview); +/* Searching */ +void ev_web_view_find_next (EvWebView *webview); +void ev_web_view_find_previous (EvWebView *webview); +void ev_web_view_find_changed (EvWebView *webview, gint page_found_on,EvJobFind *job); +void ev_web_view_find_search_changed (EvWebView *webview); +void ev_web_view_find_cancel (EvWebView *webview); +void ev_web_view_find_set_highlight_search (EvWebView *webview,gboolean visible); +void ev_web_view_empty_search (EvWebView *webview); -/*Selection*/ +/* Selection */ gboolean ev_web_view_get_has_selection (EvWebView *webview); void ev_web_view_select_all (EvWebView *webview); void ev_web_view_copy (EvWebView *webview); -/*Zoom control*/ +/* Zoom control */ gboolean ev_web_view_zoom_in (EvWebView *webview); gboolean ev_web_view_zoom_out (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') 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-jobs.c | 8 +- libview/ev-web-view.c | 273 +++++++++++++++++++++++++++++++++++--------------- libview/ev-web-view.h | 10 +- 3 files changed, 204 insertions(+), 87 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 155990e9..3a7dfd27 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -1379,7 +1379,7 @@ ev_job_find_run (EvJob *job) ev_page = ev_document_get_page (job->document, job_find->current_page); if (job->document->iswebdocument) { - job_find->has_results = ev_document_find_check_for_hits(find, ev_page, job_find->text, + job_find->results[job_find->current_page] = ev_document_find_check_for_hits(find, ev_page, job_find->text, job_find->case_sensitive); }else { matches = ev_document_find_find_text (find, ev_page, job_find->text, @@ -1393,10 +1393,14 @@ ev_job_find_run (EvJob *job) if (!job_find->has_results && !job->document->iswebdocument) { job_find->has_results = (matches != NULL); } - + else if (!job_find->has_results && job->document->iswebdocument){ + job_find->has_results = (job_find->results[job_find->current_page] > 0); + } + if (job->document->iswebdocument == FALSE) { job_find->pages[job_find->current_page] = matches; } + g_signal_emit (job_find, job_find_signals[FIND_UPDATED], 0, job_find->current_page); job_find->current_page = (job_find->current_page + 1) % job_find->n_pages; 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 */ diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index aa2d5492..751e7381 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -63,11 +63,15 @@ void ev_web_view_handle_link (EvWebView *webview, EvLink* link); /* Searching */ void ev_web_view_find_next (EvWebView *webview); void ev_web_view_find_previous (EvWebView *webview); -void ev_web_view_find_changed (EvWebView *webview, gint page_found_on,EvJobFind *job); -void ev_web_view_find_search_changed (EvWebView *webview); + +void ev_web_view_find_changed (EvWebView *webview, + guint *results, + gchar *text, + gboolean case_sensitive); + +void ev_web_view_find_search_changed (EvWebView *webview,gboolean visible); void ev_web_view_find_cancel (EvWebView *webview); void ev_web_view_find_set_highlight_search (EvWebView *webview,gboolean visible); -void ev_web_view_empty_search (EvWebView *webview); /* Selection */ gboolean ev_web_view_get_has_selection (EvWebView *webview); -- cgit v1.2.1 From 683022d92b63bea1544e8d19bc57d47ef84f5fff Mon Sep 17 00:00:00 2001 From: rootavish Date: Wed, 6 Aug 2014 17:22:34 +0530 Subject: Redesigned the thumbnail code for ePub No more crashes when searching with the sidebar open, will probably add a pixbuf cache as well to speed it up even further. The process which I earlier thought was not possible without separate jobs, work just fine as a single job, if I change the run mode of the thumbnail job, and incorporate a trylock() in case of epub. --- libview/ev-jobs.c | 187 ++++++++++++++++-------------------------------------- libview/ev-jobs.h | 23 +------ 2 files changed, 57 insertions(+), 153 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index 3a7dfd27..e7f0ba35 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -67,8 +67,6 @@ static void ev_job_page_data_init (EvJobPageData *job); static void ev_job_page_data_class_init (EvJobPageDataClass *class); static void ev_job_thumbnail_init (EvJobThumbnail *job); static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class); -static void ev_job_web_thumbnail_init (EvJobWebThumbnail *job); -static void ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class); static void ev_job_load_init (EvJobLoad *job); static void ev_job_load_class_init (EvJobLoadClass *class); static void ev_job_save_init (EvJobSave *job); @@ -112,7 +110,6 @@ G_DEFINE_TYPE (EvJobAnnots, ev_job_annots, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobPageData, ev_job_page_data, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB) -G_DEFINE_TYPE (EvJobWebThumbnail, ev_job_web_thumbnail, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobFonts, ev_job_fonts, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobSave, ev_job_save, EV_TYPE_JOB) @@ -793,6 +790,32 @@ ev_job_thumbnail_dispose (GObject *object) (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object); } +static void +web_thumbnail_get_screenshot_cb(WebKitWebView *webview, + WebKitWebFrame *webframe, + EvJobThumbnail *job_thumb) +{ + if (webkit_web_view_get_load_status(webview) != WEBKIT_LOAD_FINISHED) { + return; + } + EvPage *page = ev_document_get_page (EV_JOB(job_thumb)->document, job_thumb->page); + job_thumb->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); + EvRenderContext *rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale); + EvPage *screenshotpage; + screenshotpage = ev_page_new(job_thumb->page); + screenshotpage->backend_page = (EvBackendPage)job_thumb->surface; + screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ; + ev_render_context_set_page(rc,screenshotpage); + + job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB(job_thumb)->document), + rc, TRUE); + g_object_unref(screenshotpage); + g_object_unref(rc); + + ev_document_doc_mutex_unlock(); + ev_job_succeeded(EV_JOB(job_thumb)); +} + static gboolean ev_job_thumbnail_run (EvJob *job) { @@ -802,7 +825,14 @@ ev_job_thumbnail_run (EvJob *job) ev_debug_message (DEBUG_JOBS, "%d (%p)", job_thumb->page, job); ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); - ev_document_doc_mutex_lock (); + if (job->document->iswebdocument) { + /* Do not block the main loop */ + if (!ev_document_doc_mutex_trylock ()) + return TRUE; + } + else { + ev_document_doc_mutex_lock (); + } page = ev_document_get_page (job->document, job_thumb->page); if (job->document->iswebdocument == TRUE ) { @@ -814,38 +844,34 @@ ev_job_thumbnail_run (EvJob *job) g_object_unref (page); if (job->document->iswebdocument == TRUE) { - gboolean completed = FALSE; - cairo_surface_t *surface = NULL ; - EvJobWebThumbnail *web_thumb_job = - EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, (gchar*)rc->page->backend_page,&surface)); - - ev_job_scheduler_push_job (EV_JOB (web_thumb_job), EV_JOB_PRIORITY_HIGH); - - while (completed == FALSE) { - /* Let the job complete*/ - } - /* For the purpose of thumbnails only, we make the page a cairo surface, instead of the uri's we are passing around*/ - EvPage *screenshotpage; - screenshotpage = ev_page_new(rc->page->index); - screenshotpage->backend_page = (EvBackendPage)surface; - screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ; - ev_render_context_set_page(rc,screenshotpage); - - job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), - rc, TRUE); - - g_object_unref(web_thumb_job); - g_object_unref(screenshotpage); + if (!webview) { + webview = webkit_web_view_new(); + } + + if (!offscreenwindow) { + offscreenwindow = gtk_offscreen_window_new(); + + gtk_container_add(GTK_CONTAINER(offscreenwindow),GTK_WIDGET(webview)); + + gtk_window_set_default_size (GTK_WINDOW(offscreenwindow),800,1080); + + gtk_widget_show_all(offscreenwindow); + } + + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)rc->page->backend_page); + g_signal_connect(WEBKIT_WEB_VIEW(webview),"notify::load-status", + G_CALLBACK(web_thumbnail_get_screenshot_cb), + g_object_ref(job_thumb)); } else { job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), rc, TRUE); + ev_document_doc_mutex_unlock (); + + ev_job_succeeded (job); } g_object_unref (rc); - ev_document_doc_mutex_unlock (); - - ev_job_succeeded (job); - + return FALSE; } @@ -879,107 +905,6 @@ ev_job_thumbnail_new (EvDocument *document, return EV_JOB (job); } -/* This job is a part of thumbnails, but will run as a thread and call the otherwise main loop job on a signal*/ -/* EvJobWebThumbnail */ -static void -ev_job_web_thumbnail_init (EvJobWebThumbnail *job) -{ - EV_JOB (job)->run_mode = EV_JOB_RUN_MAIN_LOOP; -} - -static void -ev_job_web_thumbnail_dispose (GObject *object) -{ - EvJobWebThumbnail *job; - - job = EV_JOB_WEB_THUMBNAIL (object); - - ev_debug_message (DEBUG_JOBS, "%s (%p)", job->page, job); - - if(job->page) { - g_free(job->page); - job->page = NULL; - } - - (* G_OBJECT_CLASS (ev_job_web_thumbnail_parent_class)->dispose) (object); -} - -static void -web_thumbnail_get_screenshot_cb(WebKitWebView *webview, - WebKitWebFrame *webframe, - EvJobWebThumbnail *web_thumb_job) -{ - *(web_thumb_job->surface) = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); - if (*(web_thumb_job->surface)) { - //TODO : what if you don't get one? - *(web_thumb_job->completed) = TRUE; - } -} - -static gboolean -ev_job_web_thumbnail_run (EvJob *job) -{ - EvJobWebThumbnail *web_thumb_job = EV_JOB_WEB_THUMBNAIL(job); - if (!webview) { - webview = webkit_web_view_new(); - } - - if (!offscreenwindow) { - offscreenwindow = gtk_offscreen_window_new(); - - gtk_container_add(GTK_CONTAINER(offscreenwindow),GTK_WIDGET(webview)); - - gtk_window_set_default_size (GTK_WINDOW(offscreenwindow),800,1080); - - gtk_widget_show_all(offscreenwindow); - } - - ev_debug_message (DEBUG_JOBS, "%s (%p)", web_thumb_job->page, job); - -#ifdef EV_ENABLE_DEBUG - /* We use the #ifdef in this case because of the if */ - if (web_thumb_job->surface == NULL) - ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); -#endif - - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),web_thumb_job->page); - g_signal_connect(WEBKIT_WEB_VIEW(webview),"document-load-finished",G_CALLBACK(web_thumbnail_get_screenshot_cb),EV_JOB_WEB_THUMBNAIL(job)); - ev_job_succeeded (EV_JOB(web_thumb_job)); - return FALSE; -} - -static void -ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class) -{ - GObjectClass *oclass = G_OBJECT_CLASS (class); - EvJobClass *job_class = EV_JOB_CLASS (class); - - oclass->dispose = ev_job_web_thumbnail_dispose; - job_class->run = ev_job_web_thumbnail_run; -} - -EvJob * -ev_job_web_thumbnail_new (EvDocument *document, - gboolean *completed, - gchar *webpage, - cairo_surface_t **surface) -{ - EvJobWebThumbnail *job; - - ev_debug_message (DEBUG_JOBS, "%s", webpage); - - job = g_object_new (EV_TYPE_JOB_WEB_THUMBNAIL, NULL); - - EV_JOB (job)->document = g_object_ref (document); - - job->completed = completed; - - job->surface = surface; - job->page = g_strdup(webpage); - - return EV_JOB (job); -} - /* EvJobFonts */ static void ev_job_fonts_init (EvJobFonts *job) diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index 87365672..fdc23bae 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -292,6 +292,7 @@ struct _EvJobThumbnail gint page; gint rotation; gdouble scale; + cairo_surface_t *surface; GdkPixbuf *thumbnail; }; @@ -300,22 +301,6 @@ struct _EvJobThumbnailClass EvJobClass parent_class; }; -struct _EvJobWebThumbnail -{ - EvJob parent; - GtkWidget *webview; - GtkWidget *offscreenwindow; - gboolean *completed; - GRWLock screenlock; - cairo_surface_t **surface; - gchar* page; -}; - -struct _EvJobWebThumbnailClass -{ - EvJobClass parent_class; -}; - struct _EvJobFonts { EvJob parent; @@ -474,12 +459,6 @@ EvJob *ev_job_thumbnail_new (EvDocument *document, gint rotation, gdouble scale); -/* EvJobWebThumbnail */ -GType ev_job_web_thumbnail_get_type (void) G_GNUC_CONST; -EvJob *ev_job_web_thumbnail_new (EvDocument *document, - gboolean *completed, - gchar *webpage, - cairo_surface_t **surface); /* EvJobFonts */ GType ev_job_fonts_get_type (void) G_GNUC_CONST; EvJob *ev_job_fonts_new (EvDocument *document); -- 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 +++++++++++++++++++++++++++------------------------ libview/ev-web-view.h | 4 ++-- 2 files changed, 31 insertions(+), 27 deletions(-) (limited to 'libview') 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) { diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 751e7381..661ed9d0 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -69,10 +69,10 @@ void ev_web_view_find_changed (EvWebView *webview, gchar *text, gboolean case_sensitive); -void ev_web_view_find_search_changed (EvWebView *webview,gboolean visible); +void ev_web_view_find_search_changed (EvWebView *webview); void ev_web_view_find_cancel (EvWebView *webview); void ev_web_view_find_set_highlight_search (EvWebView *webview,gboolean visible); - +void ev_web_view_set_handler (EvWebView *webview,gboolean visible); /* Selection */ gboolean ev_web_view_get_has_selection (EvWebView *webview); void ev_web_view_select_all (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-jobs.c | 53 ++++++++++++ libview/ev-web-view.c | 235 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 262 insertions(+), 26 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index e7f0ba35..b5a147f1 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -790,6 +790,7 @@ ev_job_thumbnail_dispose (GObject *object) (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object); } +#if !GTK_CHECK_VERSION(3, 0, 0) static void web_thumbnail_get_screenshot_cb(WebKitWebView *webview, WebKitWebFrame *webframe, @@ -815,6 +816,50 @@ web_thumbnail_get_screenshot_cb(WebKitWebView *webview, ev_document_doc_mutex_unlock(); ev_job_succeeded(EV_JOB(job_thumb)); } +#else + +static void +snapshot_callback(WebKitWebView *webview, + GAsyncResult *results, + EvJobThumbnail *job_thumb) +{ + EvPage *page = ev_document_get_page (EV_JOB(job_thumb)->document, job_thumb->page); + job_thumb->surface = webkit_web_view_get_snapshot_finish (webview, + results, + NULL); + EvRenderContext *rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale); + EvPage *screenshotpage; + screenshotpage = ev_page_new(job_thumb->page); + screenshotpage->backend_page = (EvBackendPage)job_thumb->surface; + screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ; + ev_render_context_set_page(rc,screenshotpage); + + job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB(job_thumb)->document), + rc, TRUE); + g_object_unref(screenshotpage); + g_object_unref(rc); + + ev_document_doc_mutex_unlock(); + ev_job_succeeded(EV_JOB(job_thumb)); +} + +static void +web_thumbnail_get_screenshot_cb (WebKitWebView *webview, + WebKitLoadEvent event, + EvJobThumbnail *job_thumb) +{ + if (event != WEBKIT_LOAD_FINISHED) { + return; + } + + webkit_web_view_get_snapshot (webview, + WEBKIT_SNAPSHOT_REGION_VISIBLE, + WEBKIT_SNAPSHOT_OPTIONS_NONE, + NULL, + (GAsyncReadyCallback)snapshot_callback, + g_object_ref(job_thumb)); +} +#endif static gboolean ev_job_thumbnail_run (EvJob *job) @@ -859,9 +904,17 @@ ev_job_thumbnail_run (EvJob *job) } webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)rc->page->backend_page); +#if !GTK_CHECK_VERSION (3, 0, 0) g_signal_connect(WEBKIT_WEB_VIEW(webview),"notify::load-status", G_CALLBACK(web_thumbnail_get_screenshot_cb), g_object_ref(job_thumb)); +#else + g_signal_connect(WEBKIT_WEB_VIEW(webview),"load-changed", + G_CALLBACK(web_thumbnail_get_screenshot_cb), + g_object_ref(job_thumb)); + +#endif + g_object_unref(job_thumb); } else { job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), 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-jobs.c | 1 - libview/ev-view.c | 38 ++++++++++++++++++++++++++++++++++++++ libview/ev-view.h | 2 ++ libview/ev-web-view.c | 32 +++++++++++++++++++++++++++++++- libview/ev-web-view.h | 12 +++++++----- 5 files changed, 78 insertions(+), 7 deletions(-) mode change 100644 => 100755 libview/ev-view.c mode change 100644 => 100755 libview/ev-view.h (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index b5a147f1..c4324a1c 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -914,7 +914,6 @@ ev_job_thumbnail_run (EvJob *job) g_object_ref(job_thumb)); #endif - g_object_unref(job_thumb); } else { job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document), diff --git a/libview/ev-view.c b/libview/ev-view.c old mode 100644 new mode 100755 index 7bb56cae..ec378758 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -6568,3 +6568,41 @@ ev_view_previous_page (EvView *view) } } +/** + * ev_view_disconnect_handlers + * @view: #EvView instance + * + * Disconnect all signal handlers from the model, to ensure error free operation of the webview, + * we have an equivalent function for the webview. + */ +void +ev_view_disconnect_handlers(EvView *view) +{ + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_rotation_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_inverted_colors_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_sizing_mode_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_scale_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_continuous_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_dual_page_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_fullscreen_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_page_changed_cb), + view); + g_signal_handlers_disconnect_by_func(view->model, + G_CALLBACK (ev_view_document_changed_cb), + view); +} \ No newline at end of file diff --git a/libview/ev-view.h b/libview/ev-view.h old mode 100644 new mode 100755 index 402b9895..0a9e1718 --- a/libview/ev-view.h +++ b/libview/ev-view.h @@ -110,6 +110,8 @@ void ev_view_begin_add_annotation (EvView *view, EvAnnotationType annot_type); void ev_view_cancel_add_annotation (EvView *view); +/*For epub*/ +void ev_view_disconnect_handlers (EvView *view); G_END_DECLS #endif /* __EV_VIEW_H__ */ 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 diff --git a/libview/ev-web-view.h b/libview/ev-web-view.h index 661ed9d0..74b7eb6b 100644 --- a/libview/ev-web-view.h +++ b/libview/ev-web-view.h @@ -74,14 +74,16 @@ void ev_web_view_find_cancel (EvWebView *webview); void ev_web_view_find_set_highlight_search (EvWebView *webview,gboolean visible); void ev_web_view_set_handler (EvWebView *webview,gboolean visible); /* Selection */ -gboolean ev_web_view_get_has_selection (EvWebView *webview); -void ev_web_view_select_all (EvWebView *webview); -void ev_web_view_copy (EvWebView *webview); +gboolean ev_web_view_get_has_selection (EvWebView *webview); +void ev_web_view_select_all (EvWebView *webview); +void ev_web_view_copy (EvWebView *webview); /* Zoom control */ -gboolean ev_web_view_zoom_in (EvWebView *webview); -gboolean ev_web_view_zoom_out (EvWebView *webview); +gboolean ev_web_view_zoom_in (EvWebView *webview); +gboolean ev_web_view_zoom_out (EvWebView *webview); +/*For safe replacement by an EvView*/ +void ev_web_view_disconnect_handlers (EvWebView *webview); G_END_DECLS #endif /* __EV_WEB_VIEW_H__ */ -- 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-document-model.c | 16 +-------------- libview/ev-web-view.c | 47 ++++++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 39 deletions(-) (limited to 'libview') diff --git a/libview/ev-document-model.c b/libview/ev-document-model.c index dbf0477f..403df466 100644 --- a/libview/ev-document-model.c +++ b/libview/ev-document-model.c @@ -109,12 +109,7 @@ ev_document_model_set_property (GObject *object, ev_document_model_set_rotation (model, g_value_get_int (value)); break; case PROP_INVERTED_COLORS: - if ( model->document->iswebdocument == TRUE ) { - atril_web_document_set_inverted_colors(model,g_value_get_boolean(value)); - } - else { - ev_document_model_set_inverted_colors (model, g_value_get_boolean (value)); - } + ev_document_model_set_inverted_colors (model, g_value_get_boolean (value)); break; case PROP_SCALE: ev_document_model_set_scale (model, g_value_get_double (value)); @@ -495,15 +490,6 @@ ev_document_model_set_inverted_colors (EvDocumentModel *model, g_object_notify (G_OBJECT (model), "inverted-colors"); } -void -atril_web_document_set_inverted_colors (EvDocumentModel *model, - gboolean inverted_colors) -{ - //TODO - model->inverted_colors = FALSE; - g_object_notify (G_OBJECT (model), "inverted-colors"); -} - gboolean ev_document_model_get_inverted_colors (EvDocumentModel *model) { 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-jobs.c | 2 +- libview/ev-web-view.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index c4324a1c..eb4362a1 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -793,7 +793,7 @@ ev_job_thumbnail_dispose (GObject *object) #if !GTK_CHECK_VERSION(3, 0, 0) static void web_thumbnail_get_screenshot_cb(WebKitWebView *webview, - WebKitWebFrame *webframe, + GParamSpec *pspec, EvJobThumbnail *job_thumb) { if (webkit_web_view_get_load_status(webview) != WEBKIT_LOAD_FINISHED) { 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 From 67bb00b6c5105dc840b968db513a1e26bac7b2e0 Mon Sep 17 00:00:00 2001 From: rootavish Date: Thu, 21 Aug 2014 23:50:29 +0530 Subject: Resolved the finalising issue Resolved the issue with epub document where the documents were not getting finalised. My bad, sorry, I fix that with this commit. Also it seems I had set the wrong permissions on ev-view.[c,h]. Also fixed that. --- libview/ev-jobs.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index eb4362a1..3590d822 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -67,8 +67,8 @@ static void ev_job_page_data_init (EvJobPageData *job); static void ev_job_page_data_class_init (EvJobPageDataClass *class); static void ev_job_thumbnail_init (EvJobThumbnail *job); static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class); -static void ev_job_load_init (EvJobLoad *job); -static void ev_job_load_class_init (EvJobLoadClass *class); +static void ev_job_load_init (EvJobLoad *job); +static void ev_job_load_class_init (EvJobLoadClass *class); static void ev_job_save_init (EvJobSave *job); static void ev_job_save_class_init (EvJobSaveClass *class); static void ev_job_find_init (EvJobFind *job); @@ -791,14 +791,13 @@ ev_job_thumbnail_dispose (GObject *object) } #if !GTK_CHECK_VERSION(3, 0, 0) -static void -web_thumbnail_get_screenshot_cb(WebKitWebView *webview, - GParamSpec *pspec, - EvJobThumbnail *job_thumb) +static gboolean +web_thumbnail_get_screenshot_cb(EvJobThumbnail *job_thumb) { - if (webkit_web_view_get_load_status(webview) != WEBKIT_LOAD_FINISHED) { - return; + if (webkit_web_view_get_load_status (WEBKIT_WEB_VIEW(webview)) != WEBKIT_LOAD_FINISHED) { + return TRUE; } + EvPage *page = ev_document_get_page (EV_JOB(job_thumb)->document, job_thumb->page); job_thumb->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview)); EvRenderContext *rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale); @@ -815,6 +814,7 @@ web_thumbnail_get_screenshot_cb(WebKitWebView *webview, ev_document_doc_mutex_unlock(); ev_job_succeeded(EV_JOB(job_thumb)); + return FALSE; } #else @@ -904,10 +904,11 @@ ev_job_thumbnail_run (EvJob *job) } webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)rc->page->backend_page); -#if !GTK_CHECK_VERSION (3, 0, 0) - g_signal_connect(WEBKIT_WEB_VIEW(webview),"notify::load-status", - G_CALLBACK(web_thumbnail_get_screenshot_cb), - g_object_ref(job_thumb)); +#if !GTK_CHECK_VERSION (3, 0, 0) + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + (GSourceFunc)web_thumbnail_get_screenshot_cb, + g_object_ref (job_thumb), + (GDestroyNotify)g_object_unref); #else g_signal_connect(WEBKIT_WEB_VIEW(webview),"load-changed", G_CALLBACK(web_thumbnail_get_screenshot_cb), -- cgit v1.2.1