summaryrefslogtreecommitdiff
path: root/backend/epub
diff options
context:
space:
mode:
Diffstat (limited to 'backend/epub')
-rw-r--r--backend/epub/epub-document.c98
1 files changed, 84 insertions, 14 deletions
diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c
index 7539fef8..bf1dc00b 100644
--- a/backend/epub/epub-document.c
+++ b/backend/epub/epub-document.c
@@ -1,3 +1,25 @@
+/* this file is part of atril, a mate document viewer
+ *
+ * Copyright (C) 2014 Avishkar Gupta
+ *
+ * Author:
+ * Avishkar Gupta <[email protected]>
+ *
+ * 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 "ev-file-helpers.h"
#include "epub-document.h"
#include "unzip.h"
@@ -11,7 +33,12 @@
#include <glib/gi18n.h>
#include <glib/gstdio.h>
-#include <webkit/webkit.h>
+#if GTK_CHECK_VERSION(3, 0, 0)
+ #include <webkit2/webkit2.h>
+#else
+ #include <webkit/webkit.h>
+#endif
+
#include <gtk/gtk.h>
typedef enum _xmlParseReturnType
@@ -42,8 +69,6 @@ struct _EpubDocument
gchar* tmp_archive_dir ;
/*Stores the contentlist in a sorted manner*/
GList* contentList ;
- /*uri of the current page being displayed in the webview*/
- gchar* currentpageuri ;
/* A variable to hold our epubDocument for unzipping*/
unzFile epubDocument ;
};
@@ -68,10 +93,10 @@ epub_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
cairo_surface_t* surface=NULL;
gchar* uri = (gchar*) rc->page->backend_page;
epub_webkit_render (&surface,uri);
- while ( !surface )
- ;
- gint width = cairo_image_surface_get_width (surface);
- gint height = cairo_image_surface_get_height (surface);
+ if ( !surface ) {
+ return NULL ;
+ }
+
if (surface) {
thumbnail = ev_document_misc_pixbuf_from_surface (surface);
cairo_surface_destroy (surface);
@@ -118,7 +143,7 @@ epub_document_get_n_pages (EvDocument *document)
return g_list_length(epub_document->contentList);
}
-
+#if !GTK_CHECK_VERSION(3, 0, 0)
static void
webkit_render_cb(GtkWidget *web_view,
GParamSpec *specification,
@@ -148,6 +173,51 @@ epub_webkit_render(cairo_surface_t **surface,
webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view),uri);
}
+#else /* The webkit2 code for GTK3 */
+
+static void
+snapshot_chain_cb(WebKitWebView *web_view,
+ GAsyncResult* res,
+ cairo_surface_t **surface)
+{
+ GError * err = NULL ;
+ *surface = webkit_web_view_get_snapshot_finish(WEBKIT_WEB_VIEW(web_view),res,&err);
+ if ( err ) {
+ surface = NULL ;
+ }
+}
+
+static void
+webkit_render_cb(WebKitWebView *webview,
+ WebKitLoadEvent load_status,
+ cairo_surface_t **surface)
+{
+ if ( load_status != WEBKIT_LOAD_FINISHED )
+ return ;
+
+ webkit_web_view_get_snapshot(webview,
+ WEBKIT_SNAPSHOT_REGION_FULL_DOCUMENT,
+ WEBKIT_SNAPSHOT_OPTIONS_INCLUDE_SELECTION_HIGHLIGHTING,
+ NULL,
+ (GAsyncReadyCallback)snapshot_chain_cb,
+ surface);
+}
+
+static void epub_webkit_render(cairo_surface_t **surface,
+ const char* uri)
+{
+ GtkWidget *offscreen_window = gtk_offscreen_window_new ();
+ gtk_window_set_default_size(GTK_WINDOW(offscreen_window),800,600);
+ GtkWidget* scroll_view = gtk_scrolled_window_new (NULL,NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll_view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ GtkWidget* web_view = webkit_web_view_new ();
+ gtk_container_add(GTK_CONTAINER(offscreen_window),scroll_view);
+ gtk_container_add(GTK_CONTAINER(scroll_view),web_view);
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view),uri);
+ gtk_widget_show_all(offscreen_window);
+ g_signal_connect(web_view,"load-changed",G_CALLBACK(webkit_render_cb),surface);
+}
+#endif
/**
* epub_remove_temporary_dir : Removes a directory recursively.
* This function is same as comics_remove_temporary_dir
@@ -793,7 +863,6 @@ epub_document_init (EpubDocument *epub_document)
epub_document->archivename = NULL ;
epub_document->tmp_archive_dir = NULL ;
epub_document->contentList = NULL ;
- epub_document->currentpageuri = NULL;
}
static gboolean
@@ -869,11 +938,12 @@ epub_document_finalize (GObject *object)
if ( epub_document->contentList ) {
g_list_free_full(epub_document->contentList,(GDestroyNotify)free_tree_nodes);
}
-
- g_free (epub_document->tmp_archive_dir);
- g_free (epub_document->currentpageuri);
- g_free (epub_document->archivename);
-
+ if ( epub_document->tmp_archive_dir) {
+ g_free (epub_document->tmp_archive_dir);
+ }
+ if ( epub_document->archivename) {
+ g_free (epub_document->archivename);
+ }
G_OBJECT_CLASS (epub_document_parent_class)->finalize (object);
}