]> git.armaanb.net Git - chorizo.git/commitdiff
Implement searching the current page
authorPeter Hofmann <scm@uninformativ.de>
Sat, 14 Jun 2014 14:41:34 +0000 (16:41 +0200)
committerPeter Hofmann <scm@uninformativ.de>
Sat, 14 Jun 2014 14:41:34 +0000 (16:41 +0200)
README
zea.c

diff --git a/README b/README
index 9ad2114cc5dfb68e90cbb5b993f34b0cda1bbe04..056fe1f19e560931665ce394b426f8a161e95f11 100644 (file)
--- a/README
+++ b/README
@@ -12,11 +12,11 @@ Features:
        - Global content zoom
        - Pluggability into suckless' tabbed
        - vi-like scrolling (modified by CTRL)
+       - Searching the current page for a word
        - Support for Flash and Java
 
 Planned features:
 
-       - Searching the current page for a word
        - Adblock
        - Keyword based searching (opening "wi foo" will search wikipedia)
 
diff --git a/zea.c b/zea.c
index 29a78411fdcad7618458f594cf778a6a2a70a4c2..602f14d44b0d48ac305a8a4a4d6c6383c9cf108d 100644 (file)
--- a/zea.c
+++ b/zea.c
@@ -23,6 +23,7 @@ static gboolean zea_new_client_request(WebKitWebView *, WebKitWebFrame *,
                                        WebKitNetworkRequest *,
                                        WebKitWebNavigationAction *,
                                        WebKitWebPolicyDecision *, gpointer);
+static void zea_search(gpointer, gint);
 static void zea_scroll(GtkAdjustment *, gint, gdouble);
 static void zea_title_changed(GObject *, GParamSpec *, gpointer);
 static void zea_uri_changed(GObject *, GParamSpec *, gpointer);
@@ -33,6 +34,7 @@ static gboolean zea_web_view_key(GtkWidget *, GdkEvent *, gpointer);
 static Window embed = 0;
 static gint clients = 0;
 static gdouble global_zoom = 1.0;
+static gchar *search_text = NULL;
 
 
 struct Client
@@ -127,6 +129,7 @@ gboolean
 zea_location_key(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
        struct Client *c = (struct Client *)data;
+       const gchar *t;
 
        (void)widget;
 
@@ -135,8 +138,16 @@ zea_location_key(GtkWidget *widget, GdkEvent *event, gpointer data)
                if (((GdkEventKey *)event)->keyval == GDK_KEY_Return)
                {
                        gtk_widget_grab_focus(c->web_view);
-                       webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view),
-                                                gtk_entry_get_text(GTK_ENTRY(c->location)));
+                       t = gtk_entry_get_text(GTK_ENTRY(c->location));
+                       if (t != NULL && t[0] == '/')
+                       {
+                               if (search_text != NULL)
+                                       g_free(search_text);
+                               search_text = g_strdup(t + 1);  /* XXX whacky */
+                               zea_search(c, 1);
+                       }
+                       else
+                               webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), t);
                        return TRUE;
                }
        }
@@ -237,6 +248,18 @@ zea_new_client_request(WebKitWebView *web_view, WebKitWebFrame *frame,
        return TRUE;
 }
 
+void
+zea_search(gpointer data, gint direction)
+{
+       struct Client *c = (struct Client *)data;
+
+       if (search_text == NULL)
+               return;
+
+       webkit_web_view_search_text(WEBKIT_WEB_VIEW(c->web_view), search_text,
+                                   FALSE, direction == 1, TRUE);
+}
+
 void
 zea_scroll(GtkAdjustment *a, gint step_type, gdouble factor)
 {
@@ -366,6 +389,16 @@ zea_web_view_key(GtkWidget *widget, GdkEvent *event, gpointer data)
                                           GTK_SCROLLED_WINDOW(c->scroll)), 1, -0.5);
                                return TRUE;
                        }
+                       if (((GdkEventKey *)event)->keyval == GDK_KEY_n)
+                       {
+                               zea_search(c, 1);
+                               return TRUE;
+                       }
+                       if (((GdkEventKey *)event)->keyval == GDK_KEY_p)
+                       {
+                               zea_search(c, -1);
+                               return TRUE;
+                       }
                }
                else if (((GdkEventKey *)event)->keyval == GDK_KEY_Escape)
                {