[devhelp] Window: delegate some code for the WebKitWebView search to DhWebView



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]