summaryrefslogtreecommitdiff
path: root/libview/ev-web-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'libview/ev-web-view.c')
-rw-r--r--libview/ev-web-view.c724
1 files changed, 0 insertions, 724 deletions
diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c
deleted file mode 100644
index 782e4ea4..00000000
--- a/libview/ev-web-view.c
+++ /dev/null
@@ -1,724 +0,0 @@
-/* this file is part of atril, a mate document viewer
- *
- * Copyright (C) 2014 Avishkar Gupta
- * 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
- * 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"
-
-#if ENABLE_EPUB
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-#include <stdlib.h>
-
-#include <webkit2/webkit2.h>
-
-#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 enum {
- EV_WEB_VIEW_FIND_NEXT,
- EV_WEB_VIEW_FIND_PREV
- } EvWebViewFindDirection;
-
-typedef struct _SearchParams {
- gboolean case_sensitive;
- gchar* search_string;
- EvWebViewFindDirection direction;
- gboolean search_jump;
- gint on_result;
- guint *results;
-}SearchParams;
-
-struct _EvWebView
-{
- WebKitWebView web_view;
- EvDocument *document;
- EvDocumentModel *model;
- gint current_page;
- gboolean inverted_stylesheet ;
- gboolean fullscreen;
- SearchParams *search;
- WebKitFindController *findcontroller;
- WebKitFindOptions findoptions;
- gdouble zoom_level;
- gchar *hlink;
-};
-
-struct _EvWebViewClass
-{
- WebKitWebViewClass base_class;
-};
-
-/*** 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 ***/
-static void ev_web_view_dispose (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)
-{
- 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
-ev_web_view_dispose (GObject *object)
-{
- 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;
- }
-
- 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);
-}
-
-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);
-
- 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->results = NULL;
- webview->search->search_jump = TRUE ;
-
- webview->fullscreen = FALSE;
- webview->inverted_stylesheet = FALSE;
- webview->hlink = NULL;
-}
-
-static void
-ev_web_view_finalize (GObject *object)
-{
- G_OBJECT_CLASS(ev_web_view_parent_class)->finalize(object);
-}
-
-/*** 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);
-
- webview->current_page = new_page;
- ev_document_model_set_page(webview->model,new_page);
- webkit_find_controller_search_finish(webview->findcontroller);
- 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
-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);
-
- 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;
-
- 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);
- }
- webview->inverted_stylesheet = FALSE;
- gint current_page = ev_document_model_get_page(model);
-
- ev_web_view_change_page (webview, current_page);
-
- }
-}
-
-static void
-ev_web_view_inverted_colors_changed_cb (EvDocumentModel *model,
- GParamSpec *pspec,
- EvWebView *webview)
-{
- EvDocument *document = ev_document_model_get_document(model);
-
- if (!document || !document->iswebdocument)
- return;
-
- 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));
- }
- }
-}
-
-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->document = ev_document_model_get_document(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);
- 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) {
- 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;
- }
-}
-
-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);
- 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;
- }
-}
-
-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_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));
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),uri);
- break;
-
- default:return;
- }
- }
-}
-/* Searching */
-
-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;
- }
-}
-
-/*
- * Jump to find results once we have changed the page in the webview.
- */
-static void
-jump_to_find_results(EvWebView *webview,
- WebKitLoadEvent load_event,
- gpointer data)
-{
- if ( load_event != WEBKIT_LOAD_FINISHED) {
- return;
- }
-
- if (!webview->search->search_string) {
- return;
- }
-
- 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);
- webview->search->search_jump = FALSE;
-}
-
-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
-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 && ev_web_view_find_get_n_results(webview,page) > 0) {
- 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;
- break;
- }
-
- if (ev_web_view_find_get_n_results (webview, page) > 0) {
- webview->search->direction = direction;
- webkit_find_controller_search_finish(webview->findcontroller);
- ev_document_model_set_page (webview->model, page);
- break;
- }
- }
-}
-
-void
-ev_web_view_find_changed (EvWebView *webview, guint *results, gchar *text,gboolean case_sensitive)
-{
- webview->search->results = results;
- webview->search->on_result = 0;
- webview->search->search_string = g_strdup(text);
- webview->search->case_sensitive = case_sensitive;
- if (webview->search->search_jump == TRUE) {
- if (!case_sensitive) {
- webview->findoptions |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
- }
- else {
- webview->findoptions &= ~WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
- }
- jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 0);
- }
-}
-
-void
-ev_web_view_find_next (EvWebView *webview)
-{
- gint n_results;
-
- n_results = ev_web_view_find_get_n_results (webview, webview->current_page);
- webview->search->on_result++;
-
- if (webview->search->on_result >= n_results) {
- webview->search->on_result = 0;
- jump_to_find_page (webview, EV_WEB_VIEW_FIND_NEXT, 1);
- }
- else {
- webkit_find_controller_search_next(webview->findcontroller);
- }
-}
-
-void
-ev_web_view_find_previous (EvWebView *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 {
- webkit_find_controller_search_previous(webview->findcontroller);
- }
-}
-
-void
-ev_web_view_find_search_changed (EvWebView *webview)
-{
- /* search string has changed, focus on new search result */
- if (webview->search->search_string) {
- g_free(webview->search->search_string);
- webview->search->search_string = NULL;
- }
-
- webkit_find_controller_search_finish(webview->findcontroller);
- webview->search->search_jump = TRUE;
-}
-
-void
-ev_web_view_find_cancel (EvWebView *webview)
-{
- webkit_find_controller_search_finish (webview->findcontroller);
-}
-
-void
-ev_web_view_set_handler(EvWebView *webview,gboolean visible)
-{
- if (visible) {
- g_signal_connect(webview,
- "load-changed",
- G_CALLBACK(jump_to_find_results),
- NULL);
- g_signal_connect(webview->findcontroller,
- "counted-matches",
- G_CALLBACK(results_counted_cb),
- webview);
- }
- else {
- g_signal_handlers_disconnect_by_func(webview,
- jump_to_find_results,
- NULL);
- g_signal_handlers_disconnect_by_func(webview,
- results_counted_cb,
- NULL);
- }
-}
-
-/* Selection and copying*/
-void
-ev_web_view_select_all(EvWebView *webview)
-{
- webkit_web_view_execute_editing_command(WEBKIT_WEB_VIEW(webview),
- WEBKIT_EDITING_COMMAND_SELECT_ALL);
-}
-
-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);
- }
-}
-
-void
-ev_web_view_copy(EvWebView *webview)
-{
- webkit_web_view_can_execute_editing_command(WEBKIT_WEB_VIEW(webview),
- WEBKIT_EDITING_COMMAND_COPY,
- NULL,
- (GAsyncReadyCallback)copy_text_cb,
- NULL);
-}
-
-/*Zoom control*/
-gboolean
-ev_web_view_zoom_in(EvWebView *webview)
-{
- webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(webview),
- (webview->zoom_level+= 0.1));
- return TRUE;
-}
-
-gboolean
-ev_web_view_zoom_out(EvWebView *webview)
-{
- if (webview->zoom_level == 1)
- return FALSE;
-
- webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(webview),
- (webview->zoom_level -= 0.1));
- return TRUE;
-}
-
-gboolean
-ev_web_view_zoom_reset(EvWebView *webview)
-{
- if (webview->zoom_level == 1)
- return FALSE;
-
- webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW(webview),
- 1.0);
- 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);
-}
-#endif