[devhelp] Window: delegate some code for the WebKitWebView search to DhWebView
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [devhelp] Window: delegate some code for the WebKitWebView search to DhWebView
- Date: Fri, 9 Feb 2018 20:22:41 +0000 (UTC)
commit 5f89455a580b02350e980fc416453ccc050ec537
Author: Sébastien Wilmet <swilmet gnome org>
Date: Fri Feb 9 20:47:29 2018 +0100
Window: delegate some code for the WebKitWebView search to DhWebView
By creating a more convenient API.
src/dh-web-view.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
src/dh-web-view.h | 7 ++++
src/dh-window.c | 80 ++++++++++++++++++++--------------------------------
3 files changed, 117 insertions(+), 50 deletions(-)
---
diff --git a/src/dh-web-view.c b/src/dh-web-view.c
index bca16f9..864a196 100644
--- a/src/dh-web-view.c
+++ b/src/dh-web-view.c
@@ -19,7 +19,7 @@
#include "dh-web-view.h"
struct _DhWebViewPrivate {
- gint something;
+ gchar *search_text;
};
G_DEFINE_TYPE_WITH_PRIVATE (DhWebView, dh_web_view, WEBKIT_TYPE_WEB_VIEW)
@@ -43,6 +43,9 @@ dh_web_view_constructed (GObject *object)
static void
dh_web_view_finalize (GObject *object)
{
+ DhWebView *view = DH_WEB_VIEW (object);
+
+ g_free (view->priv->search_text);
G_OBJECT_CLASS (dh_web_view_parent_class)->finalize (object);
}
@@ -67,3 +70,78 @@ dh_web_view_new (void)
{
return g_object_new (DH_TYPE_WEB_VIEW, NULL);
}
+
+/*
+ * dh_web_view_set_search_text:
+ * @view: a #DhWebView.
+ * @search_text: (nullable): the search string, or %NULL.
+ *
+ * A more convenient API (for Devhelp needs) than #WebKitFindController. If
+ * @search_text is not empty, it calls webkit_find_controller_search() if not
+ * already done. If @search_text is empty or %NULL, it calls
+ * webkit_find_controller_search_finish().
+ */
+void
+dh_web_view_set_search_text (DhWebView *view,
+ const gchar *search_text)
+{
+ WebKitFindController *find_controller;
+
+ g_return_if_fail (DH_IS_WEB_VIEW (view));
+
+ if (g_strcmp0 (view->priv->search_text, search_text) == 0)
+ return;
+
+ g_free (view->priv->search_text);
+ view->priv->search_text = g_strdup (search_text);
+
+ find_controller = webkit_web_view_get_find_controller (WEBKIT_WEB_VIEW (view));
+
+ if (search_text != NULL && search_text[0] != '\0') {
+ /* If webkit_find_controller_search() is called a second time
+ * with the same parameters it's not a NOP, it launches a new
+ * search, apparently, which screws up search_next() and
+ * search_previous(). So we must call it only once for the same
+ * search string.
+ */
+ webkit_find_controller_search (find_controller,
+ search_text,
+ WEBKIT_FIND_OPTIONS_WRAP_AROUND |
+ WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE,
+ G_MAXUINT);
+ } else {
+ /* It's fine to call it several times. But unfortunately it
+ * doesn't change the WebKitFindController:text property. So we
+ * must store our own search_text.
+ */
+ webkit_find_controller_search_finish (find_controller);
+ }
+}
+
+void
+dh_web_view_search_next (DhWebView *view)
+{
+ WebKitFindController *find_controller;
+
+ g_return_if_fail (DH_IS_WEB_VIEW (view));
+
+ if (view->priv->search_text == NULL || view->priv->search_text[0] == '\0')
+ return;
+
+ find_controller = webkit_web_view_get_find_controller (WEBKIT_WEB_VIEW (view));
+ webkit_find_controller_search_next (find_controller);
+}
+
+void
+dh_web_view_search_previous (DhWebView *view)
+{
+ WebKitFindController *find_controller;
+
+ g_return_if_fail (DH_IS_WEB_VIEW (view));
+
+ if (view->priv->search_text == NULL || view->priv->search_text[0] == '\0')
+ return;
+
+ find_controller = webkit_web_view_get_find_controller (WEBKIT_WEB_VIEW (view));
+ webkit_find_controller_search_previous (find_controller);
+}
diff --git a/src/dh-web-view.h b/src/dh-web-view.h
index 250e3e7..1636560 100644
--- a/src/dh-web-view.h
+++ b/src/dh-web-view.h
@@ -51,6 +51,13 @@ GType dh_web_view_get_type (void);
DhWebView * dh_web_view_new (void);
+void dh_web_view_set_search_text (DhWebView *view,
+ const gchar *search_text);
+
+void dh_web_view_search_next (DhWebView *view);
+
+void dh_web_view_search_previous (DhWebView *view);
+
G_END_DECLS
#endif /* DH_WEB_VIEW_H */
diff --git a/src/dh-window.c b/src/dh-window.c
index 376be74..7533bbb 100644
--- a/src/dh-window.c
+++ b/src/dh-window.c
@@ -590,35 +590,29 @@ sidebar_link_selected_cb (DhSidebar *sidebar,
}
static void
-launch_search_in_active_web_view (DhWindow *window)
+update_search_in_web_view (DhWindow *window,
+ DhWebView *view)
{
DhWindowPrivate *priv = dh_window_get_instance_private (window);
- WebKitWebView *view;
- WebKitFindController *find_controller;
- const gchar *cur_search_text;
- const gchar *new_search_text;
+ const gchar *search_text = NULL;
- view = window_get_active_web_view (window);
- find_controller = webkit_web_view_get_find_controller (view);
+ if (gtk_search_bar_get_search_mode (priv->search_bar))
+ search_text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
- cur_search_text = webkit_find_controller_get_search_text (find_controller);
- new_search_text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
+ dh_web_view_set_search_text (view, search_text);
+}
- if (g_strcmp0 (cur_search_text, new_search_text) != 0) {
- /* If webkit_find_controller_search() is called a second time
- * with the same parameters it's not a NOP, it launches a new
- * search (apparently). So we must call it only once.
- */
- webkit_find_controller_search (find_controller,
- new_search_text,
- WEBKIT_FIND_OPTIONS_WRAP_AROUND |
- WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE,
- G_MAXUINT);
- }
+static void
+update_search_in_active_web_view (DhWindow *window)
+{
+ DhWebView *view;
+
+ view = DH_WEB_VIEW (window_get_active_web_view (window));
+ update_search_in_web_view (window, view);
}
static void
-finish_search_in_all_web_views (DhWindow *window)
+update_search_in_all_web_views (DhWindow *window)
{
DhWindowPrivate *priv = dh_window_get_instance_private (window);
gint n_pages;
@@ -628,45 +622,35 @@ finish_search_in_all_web_views (DhWindow *window)
for (page_num = 0; page_num < n_pages; page_num++) {
GtkWidget *page;
- WebKitWebView *view;
- WebKitFindController *find_controller;
+ DhWebView *view;
page = gtk_notebook_get_nth_page (priv->notebook, page_num);
view = g_object_get_data (G_OBJECT (page), TAB_WEB_VIEW_KEY);
- find_controller = webkit_web_view_get_find_controller (view);
- webkit_find_controller_search_finish (find_controller);
+ update_search_in_web_view (window, view);
}
}
static void
search_previous_in_active_web_view (DhWindow *window)
{
- WebKitWebView *view;
- WebKitFindController *find_controller;
+ DhWebView *view;
- /* Ensure that webkit_find_controller_search() is called before. */
- launch_search_in_active_web_view (window);
+ view = DH_WEB_VIEW (window_get_active_web_view (window));
- view = window_get_active_web_view (window);
- find_controller = webkit_web_view_get_find_controller (view);
-
- webkit_find_controller_search_previous (find_controller);
+ update_search_in_web_view (window, view);
+ dh_web_view_search_previous (view);
}
static void
search_next_in_active_web_view (DhWindow *window)
{
- WebKitWebView *view;
- WebKitFindController *find_controller;
-
- /* Ensure that webkit_find_controller_search() is called before. */
- launch_search_in_active_web_view (window);
+ DhWebView *view;
- view = window_get_active_web_view (window);
- find_controller = webkit_web_view_get_find_controller (view);
+ view = DH_WEB_VIEW (window_get_active_web_view (window));
- webkit_find_controller_search_next (find_controller);
+ update_search_in_web_view (window, view);
+ dh_web_view_search_next (view);
}
static void
@@ -675,9 +659,9 @@ search_mode_enabled_notify_cb (GtkSearchBar *search_bar,
DhWindow *window)
{
if (gtk_search_bar_get_search_mode (search_bar))
- launch_search_in_active_web_view (window);
+ update_search_in_active_web_view (window);
else
- finish_search_in_all_web_views (window);
+ update_search_in_all_web_views (window);
}
static void
@@ -685,7 +669,7 @@ search_changed_cb (GtkEntry *entry,
DhWindow *window)
{
/* Note that this callback is called after a small delay. */
- launch_search_in_active_web_view (window);
+ update_search_in_active_web_view (window);
}
static void
@@ -734,6 +718,7 @@ notebook_switch_page_after_cb (GtkNotebook *notebook,
update_window_title (window);
window_update_zoom_actions_state (window);
window_update_back_forward_actions_sensitivity (window);
+ update_search_in_active_web_view (window);
if (new_page != NULL) {
WebKitWebView *new_web_view;
@@ -746,9 +731,6 @@ notebook_switch_page_after_cb (GtkNotebook *notebook,
if (uri != NULL)
dh_sidebar_select_uri (priv->sidebar, uri);
}
-
- if (gtk_search_bar_get_search_mode (priv->search_bar))
- launch_search_in_active_web_view (window);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]