From 4a8eeb725d66f4ef17f47fce7480f62f4c5bc1da Mon Sep 17 00:00:00 2001 From: Peter Hofmann Date: Sat, 14 Jun 2014 16:41:34 +0200 Subject: [PATCH] Implement searching the current page --- README | 2 +- zea.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/README b/README index 9ad2114..056fe1f 100644 --- 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 29a7841..602f14d 100644 --- 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) { -- 2.39.2