|
Packit |
116408 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
|
|
Packit |
116408 |
/*
|
|
Packit |
116408 |
* Copyright (C) 2001-2008 Imendio AB
|
|
Packit |
116408 |
* Copyright (C) 2012 Aleksander Morgado <aleksander@gnu.org>
|
|
Packit |
116408 |
* Copyright (C) 2012 Thomas Bechtold <toabctl@gnome.org>
|
|
Packit |
116408 |
* Copyright (C) 2015-2018 Sébastien Wilmet <swilmet@gnome.org>
|
|
Packit |
116408 |
*
|
|
Packit |
116408 |
* This program is free software; you can redistribute it and/or
|
|
Packit |
116408 |
* modify it under the terms of the GNU General Public License as
|
|
Packit |
116408 |
* published by the Free Software Foundation; either version 2 of the
|
|
Packit |
116408 |
* License, or (at your option) any later version.
|
|
Packit |
116408 |
*
|
|
Packit |
116408 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
116408 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
116408 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
116408 |
* General Public License for more details.
|
|
Packit |
116408 |
*
|
|
Packit |
116408 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
116408 |
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
|
|
Packit |
116408 |
#include "dh-window.h"
|
|
Packit |
116408 |
#include <glib/gi18n.h>
|
|
Packit |
116408 |
#include <webkit2/webkit2.h>
|
|
Packit |
116408 |
#include "dh-book.h"
|
|
Packit |
116408 |
#include "dh-book-manager.h"
|
|
Packit |
116408 |
#include "dh-settings.h"
|
|
Packit |
116408 |
#include "dh-sidebar.h"
|
|
Packit |
116408 |
#include "dh-tab.h"
|
|
Packit |
116408 |
#include "dh-tab-label.h"
|
|
Packit |
116408 |
#include "dh-util.h"
|
|
Packit |
116408 |
#include "dh-web-view.h"
|
|
Packit |
116408 |
|
|
Packit |
116408 |
typedef struct {
|
|
Packit |
116408 |
GtkHeaderBar *header_bar;
|
|
Packit |
116408 |
GtkMenuButton *window_menu_button;
|
|
Packit |
116408 |
GMenuModel *window_menu_plus_app_menu;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
GtkPaned *hpaned;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Left side of the @hpaned. */
|
|
Packit |
116408 |
GtkWidget *grid_sidebar;
|
|
Packit |
116408 |
DhSidebar *sidebar;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Right side of the @hpaned. */
|
|
Packit |
116408 |
GtkSearchBar *search_bar;
|
|
Packit |
116408 |
GtkSearchEntry *search_entry;
|
|
Packit |
116408 |
GtkButton *search_prev_button;
|
|
Packit |
116408 |
GtkButton *search_next_button;
|
|
Packit |
116408 |
GtkNotebook *notebook;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
DhLink *selected_link;
|
|
Packit |
116408 |
} DhWindowPrivate;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void open_new_tab (DhWindow *window,
|
|
Packit |
116408 |
const gchar *location,
|
|
Packit |
116408 |
gboolean switch_focus);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
G_DEFINE_TYPE_WITH_PRIVATE (DhWindow, dh_window, GTK_TYPE_APPLICATION_WINDOW);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
dh_window_dispose (GObject *object)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (DH_WINDOW (object));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_clear_pointer (&priv->selected_link, (GDestroyNotify) dh_link_unref);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
G_OBJECT_CLASS (dh_window_parent_class)->dispose (object);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static gboolean
|
|
Packit |
116408 |
dh_window_delete_event (GtkWidget *widget,
|
|
Packit |
116408 |
GdkEventAny *event)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhSettings *settings;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
settings = dh_settings_get_singleton ();
|
|
Packit |
116408 |
dh_util_window_settings_save (GTK_WINDOW (widget),
|
|
Packit |
116408 |
dh_settings_peek_window_settings (settings));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (GTK_WIDGET_CLASS (dh_window_parent_class)->delete_event == NULL)
|
|
Packit |
116408 |
return GDK_EVENT_PROPAGATE;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return GTK_WIDGET_CLASS (dh_window_parent_class)->delete_event (widget, event);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
dh_window_class_init (DhWindowClass *klass)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
116408 |
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
object_class->dispose = dh_window_dispose;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
widget_class->delete_event = dh_window_delete_event;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Bind class to template */
|
|
Packit |
116408 |
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/devhelp/dh-window.ui");
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, header_bar);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, window_menu_button);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, window_menu_plus_app_menu);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, hpaned);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, grid_sidebar);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, search_bar);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, search_entry);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, search_prev_button);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, search_next_button);
|
|
Packit |
116408 |
gtk_widget_class_bind_template_child_private (widget_class, DhWindow, notebook);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Can return NULL during initialization and finalization, so it's better to
|
|
Packit |
116408 |
* handle the NULL case with the return value of this function.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
static DhTab *
|
|
Packit |
116408 |
get_active_tab (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint page_num;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
page_num = gtk_notebook_get_current_page (priv->notebook);
|
|
Packit |
116408 |
if (page_num == -1)
|
|
Packit |
116408 |
return NULL;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return DH_TAB (gtk_notebook_get_nth_page (priv->notebook, page_num));
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static DhWebView *
|
|
Packit |
116408 |
get_active_web_view (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhTab *tab;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
tab = get_active_tab (window);
|
|
Packit |
116408 |
return tab != NULL ? dh_tab_get_web_view (tab) : NULL;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
update_window_title (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
const gchar *title;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
title = dh_web_view_get_devhelp_title (web_view);
|
|
Packit |
116408 |
gtk_header_bar_set_title (priv->header_bar, title);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
update_zoom_actions_sensitivity (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
GAction *action;
|
|
Packit |
116408 |
gboolean enabled;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
enabled = dh_web_view_can_zoom_in (web_view);
|
|
Packit |
116408 |
action = g_action_map_lookup_action (G_ACTION_MAP (window), "zoom-in");
|
|
Packit |
116408 |
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
enabled = dh_web_view_can_zoom_out (web_view);
|
|
Packit |
116408 |
action = g_action_map_lookup_action (G_ACTION_MAP (window), "zoom-out");
|
|
Packit |
116408 |
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
enabled = dh_web_view_can_reset_zoom (web_view);
|
|
Packit |
116408 |
action = g_action_map_lookup_action (G_ACTION_MAP (window), "zoom-default");
|
|
Packit |
116408 |
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
update_back_forward_actions_sensitivity (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
GAction *action;
|
|
Packit |
116408 |
gboolean enabled;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
enabled = webkit_web_view_can_go_back (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
action = g_action_map_lookup_action (G_ACTION_MAP (window), "go-back");
|
|
Packit |
116408 |
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
enabled = webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
action = g_action_map_lookup_action (G_ACTION_MAP (window), "go-forward");
|
|
Packit |
116408 |
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
new_tab_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
open_new_tab (window, NULL, TRUE);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
next_tab_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint current_page;
|
|
Packit |
116408 |
gint n_pages;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
current_page = gtk_notebook_get_current_page (priv->notebook);
|
|
Packit |
116408 |
n_pages = gtk_notebook_get_n_pages (priv->notebook);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (current_page < n_pages - 1)
|
|
Packit |
116408 |
gtk_notebook_next_page (priv->notebook);
|
|
Packit |
116408 |
else
|
|
Packit |
116408 |
/* Wrap around to the first tab. */
|
|
Packit |
116408 |
gtk_notebook_set_current_page (priv->notebook, 0);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
prev_tab_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint current_page;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
current_page = gtk_notebook_get_current_page (priv->notebook);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (current_page > 0)
|
|
Packit |
116408 |
gtk_notebook_prev_page (priv->notebook);
|
|
Packit |
116408 |
else
|
|
Packit |
116408 |
/* Wrap around to the last tab. */
|
|
Packit |
116408 |
gtk_notebook_set_current_page (priv->notebook, -1);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
go_to_tab_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
guint16 tab_num;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
tab_num = g_variant_get_uint16 (parameter);
|
|
Packit |
116408 |
gtk_notebook_set_current_page (priv->notebook, tab_num);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
print_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
WebKitPrintOperation *print_operation;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
print_operation = webkit_print_operation_new (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
webkit_print_operation_run_dialog (print_operation, GTK_WINDOW (window));
|
|
Packit |
116408 |
g_object_unref (print_operation);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
close_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint page_num;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* FIXME: the code here closes the current *tab*, but in help-overlay.ui
|
|
Packit |
116408 |
* it is documented as "Close the current window". Look for example at
|
|
Packit |
116408 |
* what gedit does, or other GNOME apps with a GtkNotebook plus Ctrl+W
|
|
Packit |
116408 |
* shortcut, and do the same.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
page_num = gtk_notebook_get_current_page (priv->notebook);
|
|
Packit |
116408 |
gtk_notebook_remove_page (priv->notebook, page_num);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
copy_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
GtkWidget *widget;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
widget = gtk_window_get_focus (GTK_WINDOW (window));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (GTK_IS_EDITABLE (widget)) {
|
|
Packit |
116408 |
gtk_editable_copy_clipboard (GTK_EDITABLE (widget));
|
|
Packit |
116408 |
} else if (GTK_IS_TREE_VIEW (widget) &&
|
|
Packit |
116408 |
gtk_widget_is_ancestor (widget, GTK_WIDGET (priv->sidebar)) &&
|
|
Packit |
116408 |
priv->selected_link != NULL) {
|
|
Packit |
116408 |
GtkClipboard *clipboard;
|
|
Packit |
116408 |
clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
|
|
Packit |
116408 |
gtk_clipboard_set_text (clipboard,
|
|
Packit |
116408 |
dh_link_get_name (priv->selected_link),
|
|
Packit |
116408 |
-1);
|
|
Packit |
116408 |
} else {
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
webkit_web_view_execute_editing_command (WEBKIT_WEB_VIEW (web_view),
|
|
Packit |
116408 |
WEBKIT_EDITING_COMMAND_COPY);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
find_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
gtk_search_bar_set_search_mode (priv->search_bar, TRUE);
|
|
Packit |
116408 |
gtk_widget_grab_focus (GTK_WIDGET (priv->search_entry));
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
zoom_in_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
dh_web_view_zoom_in (web_view);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
zoom_out_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
dh_web_view_zoom_out (web_view);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
zoom_default_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
dh_web_view_reset_zoom (web_view);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
focus_search_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
dh_sidebar_set_search_focus (priv->sidebar);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
go_back_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
webkit_web_view_go_back (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
go_forward_cb (GSimpleAction *action,
|
|
Packit |
116408 |
GVariant *parameter,
|
|
Packit |
116408 |
gpointer user_data)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window = DH_WINDOW (user_data);
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
webkit_web_view_go_forward (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
add_actions (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
GPropertyAction *property_action;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
const GActionEntry win_entries[] = {
|
|
Packit |
116408 |
/* Tabs */
|
|
Packit |
116408 |
{ "new-tab", new_tab_cb },
|
|
Packit |
116408 |
{ "next-tab", next_tab_cb },
|
|
Packit |
116408 |
{ "prev-tab", prev_tab_cb },
|
|
Packit |
116408 |
{ "go-to-tab", go_to_tab_cb, "q" },
|
|
Packit |
116408 |
{ "print", print_cb },
|
|
Packit |
116408 |
{ "close", close_cb },
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Edit */
|
|
Packit |
116408 |
{ "copy", copy_cb },
|
|
Packit |
116408 |
{ "find", find_cb },
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* View */
|
|
Packit |
116408 |
{ "zoom-in", zoom_in_cb },
|
|
Packit |
116408 |
{ "zoom-out", zoom_out_cb },
|
|
Packit |
116408 |
{ "zoom-default", zoom_default_cb },
|
|
Packit |
116408 |
{ "focus-search", focus_search_cb },
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Go */
|
|
Packit |
116408 |
{ "go-back", go_back_cb },
|
|
Packit |
116408 |
{ "go-forward", go_forward_cb },
|
|
Packit |
116408 |
};
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_action_map_add_action_entries (G_ACTION_MAP (window),
|
|
Packit |
116408 |
win_entries,
|
|
Packit |
116408 |
G_N_ELEMENTS (win_entries),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
property_action = g_property_action_new ("show-sidebar",
|
|
Packit |
116408 |
priv->grid_sidebar,
|
|
Packit |
116408 |
"visible");
|
|
Packit |
116408 |
g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (property_action));
|
|
Packit |
116408 |
g_object_unref (property_action);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
property_action = g_property_action_new ("show-window-menu",
|
|
Packit |
116408 |
priv->window_menu_button,
|
|
Packit |
116408 |
"active");
|
|
Packit |
116408 |
g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (property_action));
|
|
Packit |
116408 |
g_object_unref (property_action);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
settings_fonts_changed_cb (DhSettings *settings,
|
|
Packit |
116408 |
const gchar *font_name_fixed,
|
|
Packit |
116408 |
const gchar *font_name_variable,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint n_pages;
|
|
Packit |
116408 |
gint page_num;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
n_pages = gtk_notebook_get_n_pages (priv->notebook);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
for (page_num = 0; page_num < n_pages; page_num++) {
|
|
Packit |
116408 |
DhTab *tab;
|
|
Packit |
116408 |
WebKitWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
tab = DH_TAB (gtk_notebook_get_nth_page (priv->notebook, page_num));
|
|
Packit |
116408 |
web_view = WEBKIT_WEB_VIEW (dh_tab_get_web_view (tab));
|
|
Packit |
116408 |
dh_util_view_set_font (web_view, font_name_fixed, font_name_variable);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
sidebar_link_selected_cb (DhSidebar *sidebar,
|
|
Packit |
116408 |
DhLink *link,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gchar *uri;
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_clear_pointer (&priv->selected_link, (GDestroyNotify) dh_link_unref);
|
|
Packit |
116408 |
priv->selected_link = dh_link_ref (link);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
uri = dh_link_get_uri (link);
|
|
Packit |
116408 |
if (uri == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), uri);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_free (uri);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
update_search_in_web_view (DhWindow *window,
|
|
Packit |
116408 |
DhWebView *view)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
const gchar *search_text = NULL;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (gtk_search_bar_get_search_mode (priv->search_bar))
|
|
Packit |
116408 |
search_text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
dh_web_view_set_search_text (view, search_text);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
update_search_in_active_web_view (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view != NULL)
|
|
Packit |
116408 |
update_search_in_web_view (window, web_view);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
update_search_in_all_web_views (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint n_pages;
|
|
Packit |
116408 |
gint page_num;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
n_pages = gtk_notebook_get_n_pages (priv->notebook);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
for (page_num = 0; page_num < n_pages; page_num++) {
|
|
Packit |
116408 |
DhTab *tab;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
tab = DH_TAB (gtk_notebook_get_nth_page (priv->notebook, page_num));
|
|
Packit |
116408 |
update_search_in_web_view (window, dh_tab_get_web_view (tab));
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_previous_in_active_web_view (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
update_search_in_web_view (window, web_view);
|
|
Packit |
116408 |
dh_web_view_search_previous (web_view);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_next_in_active_web_view (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
update_search_in_web_view (window, web_view);
|
|
Packit |
116408 |
dh_web_view_search_next (web_view);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_mode_enabled_notify_cb (GtkSearchBar *search_bar,
|
|
Packit |
116408 |
GParamSpec *pspec,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
if (gtk_search_bar_get_search_mode (search_bar))
|
|
Packit |
116408 |
update_search_in_active_web_view (window);
|
|
Packit |
116408 |
else
|
|
Packit |
116408 |
update_search_in_all_web_views (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_changed_cb (GtkEntry *entry,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
/* Note that this callback is called after a small delay. */
|
|
Packit |
116408 |
update_search_in_active_web_view (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_previous_match_cb (GtkSearchEntry *entry,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
search_previous_in_active_web_view (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_next_match_cb (GtkSearchEntry *entry,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
search_next_in_active_web_view (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_prev_button_clicked_cb (GtkButton *search_prev_button,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
search_previous_in_active_web_view (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
search_next_button_clicked_cb (GtkButton *search_next_button,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
search_next_in_active_web_view (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
show_or_hide_notebook_tabs (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
gint n_pages;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
n_pages = gtk_notebook_get_n_pages (priv->notebook);
|
|
Packit |
116408 |
gtk_notebook_set_show_tabs (priv->notebook, n_pages > 1);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
notebook_page_added_after_cb (GtkNotebook *notebook,
|
|
Packit |
116408 |
GtkWidget *child,
|
|
Packit |
116408 |
guint page_num,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
show_or_hide_notebook_tabs (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
notebook_page_removed_after_cb (GtkNotebook *notebook,
|
|
Packit |
116408 |
GtkWidget *child,
|
|
Packit |
116408 |
guint page_num,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
gint n_pages;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
n_pages = gtk_notebook_get_n_pages (notebook);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (n_pages == 0)
|
|
Packit |
116408 |
gtk_window_close (GTK_WINDOW (window));
|
|
Packit |
116408 |
else
|
|
Packit |
116408 |
show_or_hide_notebook_tabs (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
notebook_switch_page_after_cb (GtkNotebook *notebook,
|
|
Packit |
116408 |
GtkWidget *new_page,
|
|
Packit |
116408 |
guint new_page_num,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
update_window_title (window);
|
|
Packit |
116408 |
update_zoom_actions_sensitivity (window);
|
|
Packit |
116408 |
update_back_forward_actions_sensitivity (window);
|
|
Packit |
116408 |
update_search_in_active_web_view (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (new_page != NULL) {
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
const gchar *uri;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = dh_tab_get_web_view (DH_TAB (new_page));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Sync the book tree */
|
|
Packit |
116408 |
uri = webkit_web_view_get_uri (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
if (uri != NULL)
|
|
Packit |
116408 |
dh_sidebar_select_uri (priv->sidebar, uri);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
dh_window_init (DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
GtkApplication *app;
|
|
Packit |
116408 |
DhSettings *settings;
|
|
Packit |
116408 |
GSettings *paned_settings;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
gtk_widget_init_template (GTK_WIDGET (window));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
add_actions (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
app = GTK_APPLICATION (g_application_get_default ());
|
|
Packit |
116408 |
if (!gtk_application_prefers_app_menu (app)) {
|
|
Packit |
116408 |
gtk_menu_button_set_menu_model (priv->window_menu_button,
|
|
Packit |
116408 |
priv->window_menu_plus_app_menu);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
settings = dh_settings_get_singleton ();
|
|
Packit |
116408 |
g_signal_connect_object (settings,
|
|
Packit |
116408 |
"fonts-changed",
|
|
Packit |
116408 |
G_CALLBACK (settings_fonts_changed_cb),
|
|
Packit |
116408 |
window,
|
|
Packit |
116408 |
0);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
paned_settings = dh_settings_peek_paned_settings (settings);
|
|
Packit |
116408 |
g_settings_bind (paned_settings, "position",
|
|
Packit |
116408 |
priv->hpaned, "position",
|
|
Packit |
116408 |
G_SETTINGS_BIND_DEFAULT |
|
|
Packit |
116408 |
G_SETTINGS_BIND_NO_SENSITIVITY);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Sidebar */
|
|
Packit |
116408 |
priv->sidebar = DH_SIDEBAR (dh_sidebar_new (NULL));
|
|
Packit |
116408 |
gtk_widget_show (GTK_WIDGET (priv->sidebar));
|
|
Packit |
116408 |
gtk_container_add (GTK_CONTAINER (priv->grid_sidebar),
|
|
Packit |
116408 |
GTK_WIDGET (priv->sidebar));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->sidebar,
|
|
Packit |
116408 |
"link-selected",
|
|
Packit |
116408 |
G_CALLBACK (sidebar_link_selected_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Search bar above GtkNotebook */
|
|
Packit |
116408 |
gtk_search_bar_connect_entry (priv->search_bar, GTK_ENTRY (priv->search_entry));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->search_bar,
|
|
Packit |
116408 |
"notify::search-mode-enabled",
|
|
Packit |
116408 |
G_CALLBACK (search_mode_enabled_notify_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->search_entry,
|
|
Packit |
116408 |
"search-changed",
|
|
Packit |
116408 |
G_CALLBACK (search_changed_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->search_entry,
|
|
Packit |
116408 |
"previous-match",
|
|
Packit |
116408 |
G_CALLBACK (search_previous_match_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->search_entry,
|
|
Packit |
116408 |
"next-match",
|
|
Packit |
116408 |
G_CALLBACK (search_next_match_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->search_prev_button,
|
|
Packit |
116408 |
"clicked",
|
|
Packit |
116408 |
G_CALLBACK (search_prev_button_clicked_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (priv->search_next_button,
|
|
Packit |
116408 |
"clicked",
|
|
Packit |
116408 |
G_CALLBACK (search_next_button_clicked_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* HTML tabs GtkNotebook */
|
|
Packit |
116408 |
g_signal_connect_after (priv->notebook,
|
|
Packit |
116408 |
"page-added",
|
|
Packit |
116408 |
G_CALLBACK (notebook_page_added_after_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect_after (priv->notebook,
|
|
Packit |
116408 |
"page-removed",
|
|
Packit |
116408 |
G_CALLBACK (notebook_page_removed_after_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect_after (priv->notebook,
|
|
Packit |
116408 |
"switch-page",
|
|
Packit |
116408 |
G_CALLBACK (notebook_switch_page_after_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
open_new_tab (window, NULL, TRUE);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Focus search in sidebar by default. */
|
|
Packit |
116408 |
dh_sidebar_set_search_focus (priv->sidebar);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
web_view_title_notify_cb (DhWebView *web_view,
|
|
Packit |
116408 |
GParamSpec *param_spec,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
if (web_view == get_active_web_view (window))
|
|
Packit |
116408 |
update_window_title (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
web_view_zoom_level_notify_cb (DhWebView *web_view,
|
|
Packit |
116408 |
GParamSpec *pspec,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
if (web_view == get_active_web_view (window))
|
|
Packit |
116408 |
update_zoom_actions_sensitivity (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* FIXME: connect to this signal on the whole DhWindow widget instead? And call
|
|
Packit |
116408 |
* webkit_web_view_go_back/forward() on the active web view. Because when the
|
|
Packit |
116408 |
* WebKitWebView doesn't have the focus, currently this callback is not called.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
static gboolean
|
|
Packit |
116408 |
web_view_button_press_event_cb (WebKitWebView *web_view,
|
|
Packit |
116408 |
GdkEventButton *event,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
switch (event->button) {
|
|
Packit |
116408 |
/* Some mice emit button presses when the scroll wheel is tilted
|
|
Packit |
116408 |
* to the side. Web browsers use them to navigate in history.
|
|
Packit |
116408 |
*/
|
|
Packit |
116408 |
case 8:
|
|
Packit |
116408 |
webkit_web_view_go_back (web_view);
|
|
Packit |
116408 |
return GDK_EVENT_STOP;
|
|
Packit |
116408 |
case 9:
|
|
Packit |
116408 |
webkit_web_view_go_forward (web_view);
|
|
Packit |
116408 |
return GDK_EVENT_STOP;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
default:
|
|
Packit |
116408 |
break;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return GDK_EVENT_PROPAGATE;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static gchar *
|
|
Packit |
116408 |
find_equivalent_local_uri (const gchar *uri)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
gchar **components;
|
|
Packit |
116408 |
guint n_components;
|
|
Packit |
116408 |
const gchar *book_id;
|
|
Packit |
116408 |
const gchar *relative_url;
|
|
Packit |
116408 |
DhBookManager *book_manager;
|
|
Packit |
116408 |
GList *books;
|
|
Packit |
116408 |
GList *book_node;
|
|
Packit |
116408 |
gchar *local_uri = NULL;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
components = g_strsplit (uri, "/", 0);
|
|
Packit |
116408 |
n_components = g_strv_length (components);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if ((g_str_has_prefix (uri, "http://library.gnome.org/devel/") ||
|
|
Packit |
116408 |
g_str_has_prefix (uri, "https://library.gnome.org/devel/")) &&
|
|
Packit |
116408 |
n_components >= 7) {
|
|
Packit |
116408 |
book_id = components[4];
|
|
Packit |
116408 |
relative_url = components[6];
|
|
Packit |
116408 |
} else if ((g_str_has_prefix (uri, "http://developer.gnome.org/") ||
|
|
Packit |
116408 |
g_str_has_prefix (uri, "https://developer.gnome.org/")) &&
|
|
Packit |
116408 |
n_components >= 6) {
|
|
Packit |
116408 |
/* E.g. http://developer.gnome.org/gio/stable/ch02.html */
|
|
Packit |
116408 |
book_id = components[3];
|
|
Packit |
116408 |
relative_url = components[5];
|
|
Packit |
116408 |
} else {
|
|
Packit |
116408 |
goto out;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
book_manager = dh_book_manager_get_singleton ();
|
|
Packit |
116408 |
books = dh_book_manager_get_books (book_manager);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
for (book_node = books; book_node != NULL; book_node = book_node->next) {
|
|
Packit |
116408 |
DhBook *cur_book = DH_BOOK (book_node->data);
|
|
Packit |
116408 |
GList *links;
|
|
Packit |
116408 |
GList *link_node;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (g_strcmp0 (dh_book_get_id (cur_book), book_id) != 0)
|
|
Packit |
116408 |
continue;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
links = dh_book_get_links (cur_book);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
for (link_node = links; link_node != NULL; link_node = link_node->next) {
|
|
Packit |
116408 |
DhLink *cur_link = link_node->data;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (dh_link_match_relative_url (cur_link, relative_url)) {
|
|
Packit |
116408 |
local_uri = dh_link_get_uri (cur_link);
|
|
Packit |
116408 |
goto out;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
out:
|
|
Packit |
116408 |
g_strfreev (components);
|
|
Packit |
116408 |
return local_uri;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static gboolean
|
|
Packit |
116408 |
web_view_decide_policy_cb (WebKitWebView *web_view,
|
|
Packit |
116408 |
WebKitPolicyDecision *policy_decision,
|
|
Packit |
116408 |
WebKitPolicyDecisionType type,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
const char *uri;
|
|
Packit |
116408 |
WebKitNavigationPolicyDecision *navigation_decision;
|
|
Packit |
116408 |
WebKitNavigationAction *navigation_action;
|
|
Packit |
116408 |
gchar *local_uri;
|
|
Packit |
116408 |
gint button;
|
|
Packit |
116408 |
gint state;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (type != WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION)
|
|
Packit |
116408 |
return GDK_EVENT_PROPAGATE;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (policy_decision);
|
|
Packit |
116408 |
navigation_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision);
|
|
Packit |
116408 |
uri = webkit_uri_request_get_uri (webkit_navigation_action_get_request (navigation_action));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* middle click or ctrl-click -> new tab */
|
|
Packit |
116408 |
button = webkit_navigation_action_get_mouse_button (navigation_action);
|
|
Packit |
116408 |
state = webkit_navigation_action_get_modifiers (navigation_action);
|
|
Packit |
116408 |
if (button == 2 || (button == 1 && state == GDK_CONTROL_MASK)) {
|
|
Packit |
116408 |
webkit_policy_decision_ignore (policy_decision);
|
|
Packit |
116408 |
open_new_tab (window, uri, FALSE);
|
|
Packit |
116408 |
return GDK_EVENT_STOP;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (g_str_equal (uri, "about:blank")) {
|
|
Packit |
116408 |
return GDK_EVENT_PROPAGATE;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
local_uri = find_equivalent_local_uri (uri);
|
|
Packit |
116408 |
if (local_uri != NULL) {
|
|
Packit |
116408 |
webkit_policy_decision_ignore (policy_decision);
|
|
Packit |
116408 |
_dh_window_display_uri (window, local_uri);
|
|
Packit |
116408 |
g_free (local_uri);
|
|
Packit |
116408 |
return GDK_EVENT_STOP;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (!g_str_has_prefix (uri, "file://")) {
|
|
Packit |
116408 |
webkit_policy_decision_ignore (policy_decision);
|
|
Packit |
116408 |
gtk_show_uri_on_window (GTK_WINDOW (window), uri, GDK_CURRENT_TIME, NULL);
|
|
Packit |
116408 |
return GDK_EVENT_STOP;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return GDK_EVENT_PROPAGATE;
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
web_view_load_changed_cb (WebKitWebView *web_view,
|
|
Packit |
116408 |
WebKitLoadEvent load_event,
|
|
Packit |
116408 |
DhWindow *window)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (load_event == WEBKIT_LOAD_COMMITTED) {
|
|
Packit |
116408 |
const gchar *uri;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
uri = webkit_web_view_get_uri (web_view);
|
|
Packit |
116408 |
dh_sidebar_select_uri (priv->sidebar, uri);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
static void
|
|
Packit |
116408 |
open_new_tab (DhWindow *window,
|
|
Packit |
116408 |
const gchar *location,
|
|
Packit |
116408 |
gboolean switch_focus)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
DhTab *tab;
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
DhSettings *settings;
|
|
Packit |
116408 |
gchar *font_fixed = NULL;
|
|
Packit |
116408 |
gchar *font_variable = NULL;
|
|
Packit |
116408 |
GtkWidget *label;
|
|
Packit |
116408 |
gint page_num;
|
|
Packit |
116408 |
WebKitBackForwardList *back_forward_list;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
tab = dh_tab_new ();
|
|
Packit |
116408 |
gtk_widget_show (GTK_WIDGET (tab));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = dh_tab_get_web_view (tab);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Set font */
|
|
Packit |
116408 |
settings = dh_settings_get_singleton ();
|
|
Packit |
116408 |
dh_settings_get_selected_fonts (settings, &font_fixed, &font_variable);
|
|
Packit |
116408 |
dh_util_view_set_font (WEBKIT_WEB_VIEW (web_view), font_fixed, font_variable);
|
|
Packit |
116408 |
g_free (font_fixed);
|
|
Packit |
116408 |
g_free (font_variable);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (web_view,
|
|
Packit |
116408 |
"notify::title",
|
|
Packit |
116408 |
G_CALLBACK (web_view_title_notify_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (web_view,
|
|
Packit |
116408 |
"notify::zoom-level",
|
|
Packit |
116408 |
G_CALLBACK (web_view_zoom_level_notify_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (web_view,
|
|
Packit |
116408 |
"button-press-event",
|
|
Packit |
116408 |
G_CALLBACK (web_view_button_press_event_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (web_view,
|
|
Packit |
116408 |
"decide-policy",
|
|
Packit |
116408 |
G_CALLBACK (web_view_decide_policy_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_signal_connect (web_view,
|
|
Packit |
116408 |
"load-changed",
|
|
Packit |
116408 |
G_CALLBACK (web_view_load_changed_cb),
|
|
Packit |
116408 |
window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
back_forward_list = webkit_web_view_get_back_forward_list (WEBKIT_WEB_VIEW (web_view));
|
|
Packit |
116408 |
g_signal_connect_object (back_forward_list,
|
|
Packit |
116408 |
"changed",
|
|
Packit |
116408 |
G_CALLBACK (update_back_forward_actions_sensitivity),
|
|
Packit |
116408 |
window,
|
|
Packit |
116408 |
G_CONNECT_AFTER | G_CONNECT_SWAPPED);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
label = dh_tab_label_new (tab);
|
|
Packit |
116408 |
gtk_widget_show (label);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
page_num = gtk_notebook_append_page (priv->notebook,
|
|
Packit |
116408 |
GTK_WIDGET (tab),
|
|
Packit |
116408 |
label);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
gtk_container_child_set (GTK_CONTAINER (priv->notebook),
|
|
Packit |
116408 |
GTK_WIDGET (tab),
|
|
Packit |
116408 |
"tab-expand", TRUE,
|
|
Packit |
116408 |
"reorderable", TRUE,
|
|
Packit |
116408 |
NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (location != NULL)
|
|
Packit |
116408 |
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), location);
|
|
Packit |
116408 |
else
|
|
Packit |
116408 |
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), "about:blank");
|
|
Packit |
116408 |
|
|
Packit |
116408 |
if (switch_focus)
|
|
Packit |
116408 |
gtk_notebook_set_current_page (priv->notebook, page_num);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
GtkWidget *
|
|
Packit |
116408 |
dh_window_new (GtkApplication *application)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindow *window;
|
|
Packit |
116408 |
DhSettings *settings;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_return_val_if_fail (GTK_IS_APPLICATION (application), NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
window = g_object_new (DH_TYPE_WINDOW,
|
|
Packit |
116408 |
"application", application,
|
|
Packit |
116408 |
NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
settings = dh_settings_get_singleton ();
|
|
Packit |
116408 |
gtk_widget_realize (GTK_WIDGET (window));
|
|
Packit |
116408 |
dh_util_window_settings_restore (GTK_WINDOW (window),
|
|
Packit |
116408 |
dh_settings_peek_window_settings (settings));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
return GTK_WIDGET (window);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
void
|
|
Packit |
116408 |
dh_window_search (DhWindow *window,
|
|
Packit |
116408 |
const gchar *str)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_return_if_fail (DH_IS_WINDOW (window));
|
|
Packit |
116408 |
|
|
Packit |
116408 |
priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
dh_sidebar_set_search_string (priv->sidebar, str);
|
|
Packit |
116408 |
}
|
|
Packit |
116408 |
|
|
Packit |
116408 |
/* Only call this with a URI that is known to be in the docs. */
|
|
Packit |
116408 |
void
|
|
Packit |
116408 |
_dh_window_display_uri (DhWindow *window,
|
|
Packit |
116408 |
const gchar *uri)
|
|
Packit |
116408 |
{
|
|
Packit |
116408 |
DhWindowPrivate *priv;
|
|
Packit |
116408 |
DhWebView *web_view;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
g_return_if_fail (DH_IS_WINDOW (window));
|
|
Packit |
116408 |
g_return_if_fail (uri != NULL);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
priv = dh_window_get_instance_private (window);
|
|
Packit |
116408 |
|
|
Packit |
116408 |
web_view = get_active_web_view (window);
|
|
Packit |
116408 |
if (web_view == NULL)
|
|
Packit |
116408 |
return;
|
|
Packit |
116408 |
|
|
Packit |
116408 |
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), uri);
|
|
Packit |
116408 |
dh_sidebar_select_uri (priv->sidebar, uri);
|
|
Packit |
116408 |
}
|