Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/90bbe288b60402feb5d3d1b365d38092970d179e
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/90bbe288b60402feb5d3d1b365d38092970d179e
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/90bbe288b60402feb5d3d1b365d38092970d179e

The branch, vince/gtk-tab-restyle has been updated
       via  90bbe288b60402feb5d3d1b365d38092970d179e (commit)
      from  7c552edf87f93387321bcd003c825d8c4ba68d00 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=90bbe288b60402feb5d3d1b365d38092970d179e
commit 90bbe288b60402feb5d3d1b365d38092970d179e
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    move search toolbar to be per tab and move implementation to one place

diff --git a/frontends/gtk/compat.h b/frontends/gtk/compat.h
index 8ef2ed5..3b2f550 100644
--- a/frontends/gtk/compat.h
+++ b/frontends/gtk/compat.h
@@ -16,7 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/** \file
+/**
+ * \file
  * Compatibility functions for older GTK versions (interface)
  */
 
@@ -40,9 +41,6 @@
 #define NSGTK_STOCK_CANCEL "_Cancel"
 #define NSGTK_STOCK_CLEAR "edit-clear"
 #define NSGTK_STOCK_CLOSE "window-close"
-#define NSGTK_STOCK_FIND "edit-find"
-#define NSGTK_STOCK_GO_BACK "go-previous"
-#define NSGTK_STOCK_GO_FORWARD "go-next"
 #define NSGTK_STOCK_HOME "go-home"
 #define NSGTK_STOCK_INFO "dialog-information"
 #define NSGTK_STOCK_REFRESH "view-refresh"
@@ -57,9 +55,6 @@
 #define NSGTK_STOCK_CANCEL GTK_STOCK_CANCEL
 #define NSGTK_STOCK_CLEAR GTK_STOCK_CLEAR
 #define NSGTK_STOCK_CLOSE GTK_STOCK_CLOSE
-#define NSGTK_STOCK_FIND GTK_STOCK_FIND
-#define NSGTK_STOCK_GO_BACK GTK_STOCK_GO_BACK
-#define NSGTK_STOCK_GO_FORWARD GTK_STOCK_GO_FORWARD
 #define NSGTK_STOCK_HOME GTK_STOCK_HOME
 #define NSGTK_STOCK_INFO GTK_STOCK_INFO
 #define NSGTK_STOCK_REFRESH GTK_STOCK_REFRESH
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index f0b4f9b..b86b914 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -27,7 +27,6 @@
 #include "netsurf/browser_window.h"
 #include "desktop/browser_history.h"
 #include "desktop/hotlist.h"
-#include "desktop/search.h"
 
 #include "gtk/compat.h"
 #include "gtk/warn.h"
@@ -40,7 +39,6 @@
 #include "gtk/window.h"
 #include "gtk/completion.h"
 #include "gtk/tabs.h"
-#include "gtk/search.h"
 #include "gtk/resources.h"
 #include "gtk/scaffolding.h"
 
@@ -76,9 +74,6 @@ struct nsgtk_scaffolding {
        /** tab widget holding displayed pages */
        GtkNotebook *notebook;
 
-       /** In page text search context */
-       struct gtk_search *search;
-
        /** menu bar hierarchy */
        struct nsgtk_bar_submenu *menu_bar;
 
@@ -591,7 +586,8 @@ static gboolean nsgtk_on_find_activate_menu(GtkMenuItem 
*widget, gpointer data)
 {
        struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
 
-       nsgtk_scaffolding_toggle_search_bar_visibility(g);
+       nsgtk_window_search_toggle(g->top_level);
+
        return TRUE;
 }
 
@@ -1081,7 +1077,7 @@ static nserror nsgtk_menus_create(struct 
nsgtk_scaffolding *gs)
 
        gs->menu_bar = nsgtk_menu_bar_create(menushell, group);
 
-       /* toolbar URL bar menu bar search bar signal handlers */
+       /* toolbar URL bar menu bar signal handlers */
        g_signal_connect(gs->menu_bar->edit_submenu->edit,
                         "show",
                         G_CALLBACK(nsgtk_window_edit_menu_shown),
@@ -1109,119 +1105,8 @@ static nserror nsgtk_menus_create(struct 
nsgtk_scaffolding *gs)
 }
 
 
-/**
- * update search toolbar size and style
- */
-static nserror nsgtk_search_update(struct gtk_search *search)
-{
-       switch (nsoption_int(button_type)) {
-
-       case 1: /* Small icons */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_ICONS);
-               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
-                                         GTK_ICON_SIZE_SMALL_TOOLBAR);
-               break;
-
-       case 2: /* Large icons */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_ICONS);
-               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
-                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
-               break;
-
-       case 3: /* Large icons with text */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_BOTH);
-               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
-                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
-               break;
-
-       case 4: /* Text icons only */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_TEXT);
-       default:
-               break;
-       }
-       return NSERROR_OK;
-}
-
-/**
- * create text search context
- */
-static nserror
-nsgtk_search_create(GtkBuilder *builder, struct gtk_search **search_out)
-{
-       struct gtk_search *search;
-
-       search = malloc(sizeof(struct gtk_search));
-       if (search == NULL) {
-               return NSERROR_NOMEM;
-       }
-
-       search->bar = GTK_TOOLBAR(gtk_builder_get_object(builder, "searchbar"));
-       search->entry = 
GTK_ENTRY(gtk_builder_get_object(builder,"searchEntry"));
-
-       search->buttons[0] = GTK_TOOL_BUTTON(gtk_builder_get_object(
-                                               builder,"searchBackButton"));
-       search->buttons[1] = GTK_TOOL_BUTTON(gtk_builder_get_object(
-                                               builder,"searchForwardButton"));
-       search->buttons[2] = GTK_TOOL_BUTTON(gtk_builder_get_object(
-                                               builder,"closeSearchButton"));
-       search->checkAll = GTK_CHECK_BUTTON(gtk_builder_get_object(
-                                               builder,"checkAllSearch"));
-       search->caseSens = GTK_CHECK_BUTTON(gtk_builder_get_object(
-                                               builder,"caseSensButton"));
-
-       nsgtk_search_update(search);
-
-       *search_out = search;
-
-       return NSERROR_OK;
-}
-
-/**
- * connect signals to search bar
- */
-static nserror nsgtk_search_connect_signals(struct nsgtk_scaffolding *gs)
-{
-       g_signal_connect(gs->search->buttons[1],
-                        "clicked",
-                        G_CALLBACK(nsgtk_search_forward_button_clicked),
-                        gs);
-
-       g_signal_connect(gs->search->buttons[0],
-                        "clicked",
-                        G_CALLBACK(nsgtk_search_back_button_clicked),
-                        gs);
 
-       g_signal_connect(gs->search->entry,
-                        "changed",
-                        G_CALLBACK(nsgtk_search_entry_changed),
-                        gs);
 
-       g_signal_connect(gs->search->entry,
-                        "activate",
-                        G_CALLBACK(nsgtk_search_entry_activate),
-                        gs);
-
-       g_signal_connect(gs->search->entry,
-                        "key-press-event",
-                        G_CALLBACK(nsgtk_search_entry_key),
-                        gs);
-
-       g_signal_connect(gs->search->buttons[2],
-                        "clicked",
-                        G_CALLBACK(nsgtk_search_close_button_clicked),
-                        gs);
-
-       g_signal_connect(gs->search->caseSens,
-                        "toggled",
-                        G_CALLBACK(nsgtk_search_entry_changed),
-                        gs);
-
-       return NSERROR_OK;
-}
 
 
 /* exported function documented in gtk/scaffolding.h */
@@ -1314,12 +1199,6 @@ GtkWidget *nsgtk_scaffolding_urlbar(struct 
nsgtk_scaffolding *g)
 
 
 /* exported interface documented in gtk/scaffolding.h */
-struct gtk_search *nsgtk_scaffolding_search(struct nsgtk_scaffolding *g)
-{
-       return g->search;
-}
-
-/* exported interface documented in gtk/scaffolding.h */
 GtkMenuBar *nsgtk_scaffolding_menu_bar(struct nsgtk_scaffolding *gs)
 {
        if (gs == NULL) {
@@ -1346,26 +1225,6 @@ struct gui_window *nsgtk_scaffolding_top_level(struct 
nsgtk_scaffolding *g)
 
 
 /* exported interface documented in gtk/scaffolding.h */
-void nsgtk_scaffolding_toggle_search_bar_visibility(struct nsgtk_scaffolding 
*g)
-{
-       gboolean vis;
-       struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
-
-       g_object_get(G_OBJECT(g->search->bar), "visible", &vis, NULL);
-       if (vis) {
-               if (bw != NULL) {
-                       browser_window_search_clear(bw);
-               }
-
-               gtk_widget_hide(GTK_WIDGET(g->search->bar));
-       } else {
-               gtk_widget_show(GTK_WIDGET(g->search->bar));
-               gtk_widget_grab_focus(GTK_WIDGET(g->search->entry));
-       }
-}
-
-
-/* exported interface documented in gtk/scaffolding.h */
 void nsgtk_scaffolding_set_top_level(struct gui_window *gw)
 {
        struct browser_window *bw;
@@ -1387,9 +1246,6 @@ void nsgtk_scaffolding_set_top_level(struct gui_window 
*gw)
        /* Synchronise the history (will also update the URL bar) */
        scaffolding_update_context(sc);
 
-       /* clear effects of potential searches */
-       browser_window_search_clear(bw);
-
        /* Ensure the window's title bar is updated */
        nsgtk_scaffolding_set_title(gw, browser_window_get_title(bw));
 }
@@ -1589,15 +1445,6 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct 
gui_window *toplevel)
                               gs);
 
 
-       /* local page text search */
-       res = nsgtk_search_create(gs->builder, &gs->search);
-       if (res != NSERROR_OK) {
-               free(gs);
-               return NULL;
-       }
-
-       nsgtk_search_connect_signals(gs);
-
        res = nsgtk_menus_create(gs);
        if (res != NSERROR_OK) {
                free(gs);
diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h
index 28fa6ec..c30c585 100644
--- a/frontends/gtk/scaffolding.h
+++ b/frontends/gtk/scaffolding.h
@@ -29,15 +29,6 @@ struct gui_search_web_table;
 struct nsurl;
 
 
-struct gtk_search {
-       GtkToolbar *bar;
-       GtkEntry *entry;
-       GtkToolButton *buttons[3]; /* back, forward, */
-       GtkCheckButton *checkAll;
-       GtkCheckButton *caseSens;
-};
-
-
 /**
  * create a new scaffolding for a window.
  *
diff --git a/frontends/gtk/search.c b/frontends/gtk/search.c
index 6baf7f6..a75dc94 100644
--- a/frontends/gtk/search.c
+++ b/frontends/gtk/search.c
@@ -21,6 +21,7 @@
  * \file
  * Free text search (front component)
  */
+
 #include <stdint.h>
 #include <ctype.h>
 #include <string.h>
@@ -30,6 +31,7 @@
 #include "utils/log.h"
 #include "utils/messages.h"
 #include "utils/nsurl.h"
+#include "utils/nsoption.h"
 #include "netsurf/search.h"
 #include "netsurf/browser_window.h"
 #include "desktop/search.h"
@@ -50,14 +52,14 @@
  */
 static void nsgtk_search_set_forward_state(bool active, struct gui_window *gw)
 {
-       if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) {
-               struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw);
-               gtk_widget_set_sensitive(
-                       GTK_WIDGET(nsgtk_scaffolding_search(g)->buttons[1]),
-                       active);
-       }
+       struct gtk_search *search;
+
+       search = nsgtk_window_get_search(gw);
+
+       gtk_widget_set_sensitive(GTK_WIDGET(search->forward), active);
 }
 
+
 /**
  * activate search back button in gui.
  *
@@ -66,137 +68,297 @@ static void nsgtk_search_set_forward_state(bool active, 
struct gui_window *gw)
  */
 static void nsgtk_search_set_back_state(bool active, struct gui_window *gw)
 {
-       if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) {
-               struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw);
-               gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_search(
-                               g)->buttons[0]), active);
-       }
+       struct gtk_search *search;
+
+       search = nsgtk_window_get_search(gw);
+
+       gtk_widget_set_sensitive(GTK_WIDGET(search->back), active);
 }
 
-/** connected to the search forward button */
 
-gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search forward button
+ */
+static gboolean
+nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
-
-       assert(bw);
-
-       search_flags_t flags = SEARCH_FLAG_FORWARDS |
-                       (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-                       (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
-
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
+       struct gtk_search *search;
+       struct browser_window *bw;
+       search_flags_t flags;
+
+       search = (struct gtk_search *)data;
+
+       bw = nsgtk_get_browser_window(search->gw);
+
+       flags = SEARCH_FLAG_FORWARDS;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
+
        return TRUE;
 }
 
-/** connected to the search back button */
-
-gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search back button
+ */
+static gboolean
+nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
-
-       assert(bw);
-
-       search_flags_t flags = 0 |(gtk_toggle_button_get_active(
-                       GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-                       (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
-
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
+       struct gtk_search *search;
+       struct browser_window *bw;
+       search_flags_t flags;
+
+       search = (struct gtk_search *)data;
+
+       bw = nsgtk_get_browser_window(search->gw);
+
+       flags = 0;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
+
        return TRUE;
 }
 
-/** connected to the search close button */
-
-gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search close button
+ */
+static gboolean
+nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       nsgtk_scaffolding_toggle_search_bar_visibility(g);
-       return TRUE;    
+       struct gtk_search *search;
+
+       search = (struct gtk_search *)data;
+
+       nsgtk_search_toggle_visibility(search);
+
+       return TRUE;
 }
 
-/** connected to the search entry [typing] */
 
-gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search entry [typing]
+ */
+static gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
+       struct gtk_search *search;
+       struct browser_window *bw;
        search_flags_t flags;
 
-       assert(bw != NULL);
+       search = (struct gtk_search *)data;
 
-       nsgtk_search_set_forward_state(true, gw);
-       nsgtk_search_set_back_state(true, gw);
+       nsgtk_search_set_forward_state(true, search->gw);
+       nsgtk_search_set_back_state(true, search->gw);
 
-       flags = SEARCH_FLAG_FORWARDS |
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
+       bw = nsgtk_get_browser_window(search->gw);
+
+       flags = SEARCH_FLAG_FORWARDS;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
 
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
        return TRUE;
 }
 
-/** connected to the search entry [return key] */
-
-gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search entry [return key]
+ */
+static gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
+       struct gtk_search *search;
+       struct browser_window *bw;
        search_flags_t flags;
 
-       assert(bw);
+       search = (struct gtk_search *)data;
+
+       nsgtk_search_set_forward_state(true, search->gw);
+       nsgtk_search_set_back_state(true, search->gw);
+
+       bw = nsgtk_get_browser_window(search->gw);
 
-       flags = SEARCH_FLAG_FORWARDS |
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
+       flags = SEARCH_FLAG_FORWARDS;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
 
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
        return FALSE;
 }
 
-/** allows escape key to close search bar too */
-
-gboolean
+/**
+ * allows escape key to close search bar too
+ */
+static gboolean
 nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
        if (event->keyval == GDK_KEY(Escape)) {
-               struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-               nsgtk_scaffolding_toggle_search_bar_visibility(g);
+               struct gtk_search *search;
+               search = (struct gtk_search *)data;
+
+               nsgtk_search_toggle_visibility(search);
        }
        return FALSE;
 }
 
 
-
-
 static struct gui_search_table search_table = {
        .forward_state = (void *)nsgtk_search_set_forward_state,
        .back_state = (void *)nsgtk_search_set_back_state,
 };
 
 struct gui_search_table *nsgtk_search_table = &search_table;
+
+
+/* exported interface documented in gtk/scaffolding.h */
+nserror nsgtk_search_toggle_visibility(struct gtk_search *search)
+{
+       gboolean vis;
+
+       g_object_get(G_OBJECT(search->bar), "visible", &vis, NULL);
+       if (vis) {
+               
browser_window_search_clear(nsgtk_get_browser_window(search->gw));
+
+               gtk_widget_hide(GTK_WIDGET(search->bar));
+       } else {
+               gtk_widget_show(GTK_WIDGET(search->bar));
+               gtk_widget_grab_focus(GTK_WIDGET(search->entry));
+       }
+
+       return NSERROR_OK;
+}
+
+
+/* exported interface documented in gtk/search.h */
+nserror nsgtk_search_restyle(struct gtk_search *search)
+{
+       switch (nsoption_int(button_type)) {
+
+       case 1: /* Small icons */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_ICONS);
+               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
+                                         GTK_ICON_SIZE_SMALL_TOOLBAR);
+               break;
+
+       case 2: /* Large icons */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_ICONS);
+               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
+                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
+               break;
+
+       case 3: /* Large icons with text */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_BOTH);
+               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
+                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
+               break;
+
+       case 4: /* Text icons only */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_TEXT);
+       default:
+               break;
+       }
+       return NSERROR_OK;
+}
+
+
+/* exported interface documented in gtk/search.h */
+nserror
+nsgtk_search_create(GtkBuilder *builder,
+                   struct gtk_search **search_out,
+                   struct gui_window *gw)
+{
+       struct gtk_search *search;
+
+       search = malloc(sizeof(struct gtk_search));
+       if (search == NULL) {
+               return NSERROR_NOMEM;
+       }
+
+       search->gw = gw;
+
+       search->bar = GTK_TOOLBAR(gtk_builder_get_object(builder,
+                                                       "searchbar"));
+       search->entry = GTK_ENTRY(gtk_builder_get_object(builder,
+                                                       "searchEntry"));
+       search->back = GTK_TOOL_BUTTON(gtk_builder_get_object(builder,
+                                                       "searchBackButton"));
+       search->forward = GTK_TOOL_BUTTON(gtk_builder_get_object(builder,
+                                                       "searchForwardButton"));
+       search->close = GTK_TOOL_BUTTON(gtk_builder_get_object(builder,
+                                                       "closeSearchButton"));
+       search->checkAll = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
+                                                       "checkAllSearch"));
+       search->caseSens = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
+                                                       "caseSensButton"));
+
+       g_signal_connect(search->forward,
+                        "clicked",
+                        G_CALLBACK(nsgtk_search_forward_button_clicked),
+                        search);
+
+       g_signal_connect(search->back,
+                        "clicked",
+                        G_CALLBACK(nsgtk_search_back_button_clicked),
+                        search);
+
+       g_signal_connect(search->entry,
+                        "changed",
+                        G_CALLBACK(nsgtk_search_entry_changed),
+                        search);
+
+       g_signal_connect(search->entry,
+                        "activate",
+                        G_CALLBACK(nsgtk_search_entry_activate),
+                        search);
+
+       g_signal_connect(search->entry,
+                        "key-press-event",
+                        G_CALLBACK(nsgtk_search_entry_key),
+                        search);
+
+       g_signal_connect(search->close,
+                        "clicked",
+                        G_CALLBACK(nsgtk_search_close_button_clicked),
+                        search);
+
+       g_signal_connect(search->caseSens,
+                        "toggled",
+                        G_CALLBACK(nsgtk_search_entry_changed),
+                        search);
+
+       nsgtk_search_restyle(search);
+
+       *search_out = search;
+
+       return NSERROR_OK;
+}
diff --git a/frontends/gtk/search.h b/frontends/gtk/search.h
index 716a60d..b242c86 100644
--- a/frontends/gtk/search.h
+++ b/frontends/gtk/search.h
@@ -16,25 +16,47 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef _NETSURF_GTK_SEARCH_H_
-#define _NETSURF_GTK_SEARCH_H_
-
 /**
  * \file
  * free text page search for gtk interfaces
  */
 
+#ifndef NETSURF_GTK_SEARCH_H_
+#define NETSURF_GTK_SEARCH_H_
+
 extern struct gui_search_table *nsgtk_search_table;
 
 struct nsgtk_scaffolding;
 
-void nsgtk_search_bar_toggle_visibility(struct nsgtk_scaffolding * g);
-gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, 
gpointer data);
-gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data);
+struct gtk_search {
+       GtkToolbar *bar;
+       GtkEntry *entry;
+       GtkToolButton *back;
+       GtkToolButton *forward;
+       GtkToolButton *close;
+       GtkCheckButton *checkAll;
+       GtkCheckButton *caseSens;
+
+       struct gui_window *gw;
+};
+
+/**
+ * create text search context
+ *
+ * \param builder the gtk builder containing the search toolbar
+ * \param search_out search context result
+ * \return NSERROR_OK and search_out updated
+ */
+nserror nsgtk_search_create(GtkBuilder *builder, struct gtk_search 
**search_out, struct gui_window *gw);
+
+/**
+ * update search toolbar size and style
+ */
+nserror nsgtk_search_restyle(struct gtk_search *search);
+
+/**
+ * toggle search bar visibility
+ */
+nserror nsgtk_search_toggle_visibility(struct gtk_search *search);
 
-               
 #endif
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 8d6c092..0d868a0 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2009 Mark Benjamin <[email protected]>
+ * Copyright 2019 Vincent Sanders <[email protected]>
  *
  * This file is part of NetSurf, http://www.netsurf-browser.org/
  *
@@ -18,7 +18,7 @@
 
 /**
  * \file
- * implementatio of toolbar to control browsing context
+ * implementation of toolbar to control browsing context
  */
 
 #include <stdlib.h>
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 647f15f..a8badc4 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -62,6 +62,7 @@
 #include "gtk/bitmap.h"
 #include "gtk/gdk.h"
 #include "gtk/resources.h"
+#include "gtk/search.h"
 #include "gtk/window.h"
 
 static GtkWidget *select_menu;
@@ -99,6 +100,9 @@ struct gui_window {
        /** controls toolbar context */
        struct nsgtk_toolbar *toolbar;
 
+       /** search toolbar context */
+       struct gtk_search *search;
+
        /** The top level container (tabBox) */
        GtkWidget *container;
 
@@ -779,6 +783,7 @@ gui_window_create(struct browser_window *bw,
        g->input_method = gtk_im_multicontext_new();
 
 
+       /* create toolbar */
        res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g, &g->toolbar);
        if (res != NSERROR_OK) {
                free(g);
@@ -786,6 +791,13 @@ gui_window_create(struct browser_window *bw,
                return NULL;
        }
 
+       /* local page text search toolbar */
+       res = nsgtk_search_create(tab_builder, &g->search, g);
+       if (res != NSERROR_OK) {
+               free(g);
+               g_object_unref(tab_builder);
+               return NULL;
+       }
 
        /* set a default favicon */
        g_object_ref(favicon_pixbuf);
@@ -1468,6 +1480,13 @@ struct nsgtk_scaffolding *nsgtk_get_scaffold(struct 
gui_window *g)
 
 
 /* exported interface documented in window.h */
+struct gtk_search *nsgtk_window_get_search(struct gui_window *gw)
+{
+       return gw->search;
+}
+
+
+/* exported interface documented in window.h */
 struct browser_window *nsgtk_get_browser_window(struct gui_window *g)
 {
        return g->bw;
@@ -1490,6 +1509,14 @@ GtkLayout *nsgtk_window_get_layout(struct gui_window *g)
 
 /* exported interface documented in window.h */
 nserror
+nsgtk_window_search_toggle(struct gui_window *gw)
+{
+       return nsgtk_search_toggle_visibility(gw->search);
+}
+
+
+/* exported interface documented in window.h */
+nserror
 nsgtk_window_item_activate(struct gui_window *gw, nsgtk_toolbar_button itemid)
 {
        return nsgtk_toolbar_item_activate(gw->toolbar, itemid);
@@ -1511,7 +1538,7 @@ nserror nsgtk_window_update_all(void)
        for (gw = window_list; gw != NULL; gw = gw->next) {
                
nsgtk_tab_options_changed(nsgtk_scaffolding_notebook(gw->scaffold));
                nsgtk_toolbar_restyle(gw->toolbar);
-               /** \todo update search bar */
+               nsgtk_search_restyle(gw->search);
                browser_window_schedule_reformat(gw->bw);
        }
        return NSERROR_OK;
diff --git a/frontends/gtk/window.h b/frontends/gtk/window.h
index 9d8d16e..69b1cdc 100644
--- a/frontends/gtk/window.h
+++ b/frontends/gtk/window.h
@@ -85,6 +85,14 @@ void nsgtk_window_destroy_browser(struct gui_window *gw);
  */
 unsigned long nsgtk_window_get_signalhandler(struct gui_window *gw, int i);
 
+
+/**
+ * toggle search visibility
+ *
+ * \param gw gui window handle
+ */
+nserror nsgtk_window_search_toggle(struct gui_window *gw);
+
 /**
  * get gtk layout from gui handle
  *
@@ -94,6 +102,11 @@ GtkLayout *nsgtk_window_get_layout(struct gui_window *gw);
 
 
 /**
+ * get search from window handle
+ */
+struct gtk_search *nsgtk_window_get_search(struct gui_window *gw);
+
+/**
  * activate the handler for a item in a toolbar of a gui window
  *
  * \param gw The gui window handle


-----------------------------------------------------------------------

Summary of changes:
 frontends/gtk/compat.h      |    9 +-
 frontends/gtk/scaffolding.c |  159 +-------------------
 frontends/gtk/scaffolding.h |    9 --
 frontends/gtk/search.c      |  350 +++++++++++++++++++++++++++++++------------
 frontends/gtk/search.h      |   44 ++++--
 frontends/gtk/toolbar.c     |    4 +-
 frontends/gtk/window.c      |   29 +++-
 frontends/gtk/window.h      |   13 ++
 8 files changed, 337 insertions(+), 280 deletions(-)

diff --git a/frontends/gtk/compat.h b/frontends/gtk/compat.h
index 8ef2ed5..3b2f550 100644
--- a/frontends/gtk/compat.h
+++ b/frontends/gtk/compat.h
@@ -16,7 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/** \file
+/**
+ * \file
  * Compatibility functions for older GTK versions (interface)
  */
 
@@ -40,9 +41,6 @@
 #define NSGTK_STOCK_CANCEL "_Cancel"
 #define NSGTK_STOCK_CLEAR "edit-clear"
 #define NSGTK_STOCK_CLOSE "window-close"
-#define NSGTK_STOCK_FIND "edit-find"
-#define NSGTK_STOCK_GO_BACK "go-previous"
-#define NSGTK_STOCK_GO_FORWARD "go-next"
 #define NSGTK_STOCK_HOME "go-home"
 #define NSGTK_STOCK_INFO "dialog-information"
 #define NSGTK_STOCK_REFRESH "view-refresh"
@@ -57,9 +55,6 @@
 #define NSGTK_STOCK_CANCEL GTK_STOCK_CANCEL
 #define NSGTK_STOCK_CLEAR GTK_STOCK_CLEAR
 #define NSGTK_STOCK_CLOSE GTK_STOCK_CLOSE
-#define NSGTK_STOCK_FIND GTK_STOCK_FIND
-#define NSGTK_STOCK_GO_BACK GTK_STOCK_GO_BACK
-#define NSGTK_STOCK_GO_FORWARD GTK_STOCK_GO_FORWARD
 #define NSGTK_STOCK_HOME GTK_STOCK_HOME
 #define NSGTK_STOCK_INFO GTK_STOCK_INFO
 #define NSGTK_STOCK_REFRESH GTK_STOCK_REFRESH
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index f0b4f9b..b86b914 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -27,7 +27,6 @@
 #include "netsurf/browser_window.h"
 #include "desktop/browser_history.h"
 #include "desktop/hotlist.h"
-#include "desktop/search.h"
 
 #include "gtk/compat.h"
 #include "gtk/warn.h"
@@ -40,7 +39,6 @@
 #include "gtk/window.h"
 #include "gtk/completion.h"
 #include "gtk/tabs.h"
-#include "gtk/search.h"
 #include "gtk/resources.h"
 #include "gtk/scaffolding.h"
 
@@ -76,9 +74,6 @@ struct nsgtk_scaffolding {
        /** tab widget holding displayed pages */
        GtkNotebook *notebook;
 
-       /** In page text search context */
-       struct gtk_search *search;
-
        /** menu bar hierarchy */
        struct nsgtk_bar_submenu *menu_bar;
 
@@ -591,7 +586,8 @@ static gboolean nsgtk_on_find_activate_menu(GtkMenuItem 
*widget, gpointer data)
 {
        struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
 
-       nsgtk_scaffolding_toggle_search_bar_visibility(g);
+       nsgtk_window_search_toggle(g->top_level);
+
        return TRUE;
 }
 
@@ -1081,7 +1077,7 @@ static nserror nsgtk_menus_create(struct 
nsgtk_scaffolding *gs)
 
        gs->menu_bar = nsgtk_menu_bar_create(menushell, group);
 
-       /* toolbar URL bar menu bar search bar signal handlers */
+       /* toolbar URL bar menu bar signal handlers */
        g_signal_connect(gs->menu_bar->edit_submenu->edit,
                         "show",
                         G_CALLBACK(nsgtk_window_edit_menu_shown),
@@ -1109,119 +1105,8 @@ static nserror nsgtk_menus_create(struct 
nsgtk_scaffolding *gs)
 }
 
 
-/**
- * update search toolbar size and style
- */
-static nserror nsgtk_search_update(struct gtk_search *search)
-{
-       switch (nsoption_int(button_type)) {
-
-       case 1: /* Small icons */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_ICONS);
-               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
-                                         GTK_ICON_SIZE_SMALL_TOOLBAR);
-               break;
-
-       case 2: /* Large icons */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_ICONS);
-               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
-                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
-               break;
-
-       case 3: /* Large icons with text */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_BOTH);
-               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
-                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
-               break;
-
-       case 4: /* Text icons only */
-               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
-                                     GTK_TOOLBAR_TEXT);
-       default:
-               break;
-       }
-       return NSERROR_OK;
-}
-
-/**
- * create text search context
- */
-static nserror
-nsgtk_search_create(GtkBuilder *builder, struct gtk_search **search_out)
-{
-       struct gtk_search *search;
-
-       search = malloc(sizeof(struct gtk_search));
-       if (search == NULL) {
-               return NSERROR_NOMEM;
-       }
-
-       search->bar = GTK_TOOLBAR(gtk_builder_get_object(builder, "searchbar"));
-       search->entry = 
GTK_ENTRY(gtk_builder_get_object(builder,"searchEntry"));
-
-       search->buttons[0] = GTK_TOOL_BUTTON(gtk_builder_get_object(
-                                               builder,"searchBackButton"));
-       search->buttons[1] = GTK_TOOL_BUTTON(gtk_builder_get_object(
-                                               builder,"searchForwardButton"));
-       search->buttons[2] = GTK_TOOL_BUTTON(gtk_builder_get_object(
-                                               builder,"closeSearchButton"));
-       search->checkAll = GTK_CHECK_BUTTON(gtk_builder_get_object(
-                                               builder,"checkAllSearch"));
-       search->caseSens = GTK_CHECK_BUTTON(gtk_builder_get_object(
-                                               builder,"caseSensButton"));
-
-       nsgtk_search_update(search);
-
-       *search_out = search;
-
-       return NSERROR_OK;
-}
-
-/**
- * connect signals to search bar
- */
-static nserror nsgtk_search_connect_signals(struct nsgtk_scaffolding *gs)
-{
-       g_signal_connect(gs->search->buttons[1],
-                        "clicked",
-                        G_CALLBACK(nsgtk_search_forward_button_clicked),
-                        gs);
-
-       g_signal_connect(gs->search->buttons[0],
-                        "clicked",
-                        G_CALLBACK(nsgtk_search_back_button_clicked),
-                        gs);
 
-       g_signal_connect(gs->search->entry,
-                        "changed",
-                        G_CALLBACK(nsgtk_search_entry_changed),
-                        gs);
 
-       g_signal_connect(gs->search->entry,
-                        "activate",
-                        G_CALLBACK(nsgtk_search_entry_activate),
-                        gs);
-
-       g_signal_connect(gs->search->entry,
-                        "key-press-event",
-                        G_CALLBACK(nsgtk_search_entry_key),
-                        gs);
-
-       g_signal_connect(gs->search->buttons[2],
-                        "clicked",
-                        G_CALLBACK(nsgtk_search_close_button_clicked),
-                        gs);
-
-       g_signal_connect(gs->search->caseSens,
-                        "toggled",
-                        G_CALLBACK(nsgtk_search_entry_changed),
-                        gs);
-
-       return NSERROR_OK;
-}
 
 
 /* exported function documented in gtk/scaffolding.h */
@@ -1314,12 +1199,6 @@ GtkWidget *nsgtk_scaffolding_urlbar(struct 
nsgtk_scaffolding *g)
 
 
 /* exported interface documented in gtk/scaffolding.h */
-struct gtk_search *nsgtk_scaffolding_search(struct nsgtk_scaffolding *g)
-{
-       return g->search;
-}
-
-/* exported interface documented in gtk/scaffolding.h */
 GtkMenuBar *nsgtk_scaffolding_menu_bar(struct nsgtk_scaffolding *gs)
 {
        if (gs == NULL) {
@@ -1346,26 +1225,6 @@ struct gui_window *nsgtk_scaffolding_top_level(struct 
nsgtk_scaffolding *g)
 
 
 /* exported interface documented in gtk/scaffolding.h */
-void nsgtk_scaffolding_toggle_search_bar_visibility(struct nsgtk_scaffolding 
*g)
-{
-       gboolean vis;
-       struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
-
-       g_object_get(G_OBJECT(g->search->bar), "visible", &vis, NULL);
-       if (vis) {
-               if (bw != NULL) {
-                       browser_window_search_clear(bw);
-               }
-
-               gtk_widget_hide(GTK_WIDGET(g->search->bar));
-       } else {
-               gtk_widget_show(GTK_WIDGET(g->search->bar));
-               gtk_widget_grab_focus(GTK_WIDGET(g->search->entry));
-       }
-}
-
-
-/* exported interface documented in gtk/scaffolding.h */
 void nsgtk_scaffolding_set_top_level(struct gui_window *gw)
 {
        struct browser_window *bw;
@@ -1387,9 +1246,6 @@ void nsgtk_scaffolding_set_top_level(struct gui_window 
*gw)
        /* Synchronise the history (will also update the URL bar) */
        scaffolding_update_context(sc);
 
-       /* clear effects of potential searches */
-       browser_window_search_clear(bw);
-
        /* Ensure the window's title bar is updated */
        nsgtk_scaffolding_set_title(gw, browser_window_get_title(bw));
 }
@@ -1589,15 +1445,6 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct 
gui_window *toplevel)
                               gs);
 
 
-       /* local page text search */
-       res = nsgtk_search_create(gs->builder, &gs->search);
-       if (res != NSERROR_OK) {
-               free(gs);
-               return NULL;
-       }
-
-       nsgtk_search_connect_signals(gs);
-
        res = nsgtk_menus_create(gs);
        if (res != NSERROR_OK) {
                free(gs);
diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h
index 28fa6ec..c30c585 100644
--- a/frontends/gtk/scaffolding.h
+++ b/frontends/gtk/scaffolding.h
@@ -29,15 +29,6 @@ struct gui_search_web_table;
 struct nsurl;
 
 
-struct gtk_search {
-       GtkToolbar *bar;
-       GtkEntry *entry;
-       GtkToolButton *buttons[3]; /* back, forward, */
-       GtkCheckButton *checkAll;
-       GtkCheckButton *caseSens;
-};
-
-
 /**
  * create a new scaffolding for a window.
  *
diff --git a/frontends/gtk/search.c b/frontends/gtk/search.c
index 6baf7f6..a75dc94 100644
--- a/frontends/gtk/search.c
+++ b/frontends/gtk/search.c
@@ -21,6 +21,7 @@
  * \file
  * Free text search (front component)
  */
+
 #include <stdint.h>
 #include <ctype.h>
 #include <string.h>
@@ -30,6 +31,7 @@
 #include "utils/log.h"
 #include "utils/messages.h"
 #include "utils/nsurl.h"
+#include "utils/nsoption.h"
 #include "netsurf/search.h"
 #include "netsurf/browser_window.h"
 #include "desktop/search.h"
@@ -50,14 +52,14 @@
  */
 static void nsgtk_search_set_forward_state(bool active, struct gui_window *gw)
 {
-       if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) {
-               struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw);
-               gtk_widget_set_sensitive(
-                       GTK_WIDGET(nsgtk_scaffolding_search(g)->buttons[1]),
-                       active);
-       }
+       struct gtk_search *search;
+
+       search = nsgtk_window_get_search(gw);
+
+       gtk_widget_set_sensitive(GTK_WIDGET(search->forward), active);
 }
 
+
 /**
  * activate search back button in gui.
  *
@@ -66,137 +68,297 @@ static void nsgtk_search_set_forward_state(bool active, 
struct gui_window *gw)
  */
 static void nsgtk_search_set_back_state(bool active, struct gui_window *gw)
 {
-       if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) {
-               struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw);
-               gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_search(
-                               g)->buttons[0]), active);
-       }
+       struct gtk_search *search;
+
+       search = nsgtk_window_get_search(gw);
+
+       gtk_widget_set_sensitive(GTK_WIDGET(search->back), active);
 }
 
-/** connected to the search forward button */
 
-gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search forward button
+ */
+static gboolean
+nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
-
-       assert(bw);
-
-       search_flags_t flags = SEARCH_FLAG_FORWARDS |
-                       (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-                       (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
-
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
+       struct gtk_search *search;
+       struct browser_window *bw;
+       search_flags_t flags;
+
+       search = (struct gtk_search *)data;
+
+       bw = nsgtk_get_browser_window(search->gw);
+
+       flags = SEARCH_FLAG_FORWARDS;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
+
        return TRUE;
 }
 
-/** connected to the search back button */
-
-gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search back button
+ */
+static gboolean
+nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
-
-       assert(bw);
-
-       search_flags_t flags = 0 |(gtk_toggle_button_get_active(
-                       GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-                       (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
-
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
+       struct gtk_search *search;
+       struct browser_window *bw;
+       search_flags_t flags;
+
+       search = (struct gtk_search *)data;
+
+       bw = nsgtk_get_browser_window(search->gw);
+
+       flags = 0;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
+
        return TRUE;
 }
 
-/** connected to the search close button */
-
-gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search close button
+ */
+static gboolean
+nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       nsgtk_scaffolding_toggle_search_bar_visibility(g);
-       return TRUE;    
+       struct gtk_search *search;
+
+       search = (struct gtk_search *)data;
+
+       nsgtk_search_toggle_visibility(search);
+
+       return TRUE;
 }
 
-/** connected to the search entry [typing] */
 
-gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search entry [typing]
+ */
+static gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
+       struct gtk_search *search;
+       struct browser_window *bw;
        search_flags_t flags;
 
-       assert(bw != NULL);
+       search = (struct gtk_search *)data;
 
-       nsgtk_search_set_forward_state(true, gw);
-       nsgtk_search_set_back_state(true, gw);
+       nsgtk_search_set_forward_state(true, search->gw);
+       nsgtk_search_set_back_state(true, search->gw);
 
-       flags = SEARCH_FLAG_FORWARDS |
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
+       bw = nsgtk_get_browser_window(search->gw);
+
+       flags = SEARCH_FLAG_FORWARDS;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
 
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
        return TRUE;
 }
 
-/** connected to the search entry [return key] */
-
-gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data)
+/**
+ * connected to the search entry [return key]
+ */
+static gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       struct gui_window *gw = nsgtk_scaffolding_top_level(g);
-       struct browser_window *bw = nsgtk_get_browser_window(gw);
+       struct gtk_search *search;
+       struct browser_window *bw;
        search_flags_t flags;
 
-       assert(bw);
+       search = (struct gtk_search *)data;
+
+       nsgtk_search_set_forward_state(true, search->gw);
+       nsgtk_search_set_back_state(true, search->gw);
+
+       bw = nsgtk_get_browser_window(search->gw);
 
-       flags = SEARCH_FLAG_FORWARDS |
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->caseSens)) ?
-                       SEARCH_FLAG_CASE_SENSITIVE : 0) | 
-               (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
-                       nsgtk_scaffolding_search(g)->checkAll)) ?
-                       SEARCH_FLAG_SHOWALL : 0);
+       flags = SEARCH_FLAG_FORWARDS;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) {
+               flags |= SEARCH_FLAG_CASE_SENSITIVE;
+       }
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
+               flags |= SEARCH_FLAG_SHOWALL;
+       }
+
+       browser_window_search(bw, search->gw, flags, 
gtk_entry_get_text(search->entry));
 
-       browser_window_search(bw, gw, flags,
-                       gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry));
        return FALSE;
 }
 
-/** allows escape key to close search bar too */
-
-gboolean
+/**
+ * allows escape key to close search bar too
+ */
+static gboolean
 nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
        if (event->keyval == GDK_KEY(Escape)) {
-               struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-               nsgtk_scaffolding_toggle_search_bar_visibility(g);
+               struct gtk_search *search;
+               search = (struct gtk_search *)data;
+
+               nsgtk_search_toggle_visibility(search);
        }
        return FALSE;
 }
 
 
-
-
 static struct gui_search_table search_table = {
        .forward_state = (void *)nsgtk_search_set_forward_state,
        .back_state = (void *)nsgtk_search_set_back_state,
 };
 
 struct gui_search_table *nsgtk_search_table = &search_table;
+
+
+/* exported interface documented in gtk/scaffolding.h */
+nserror nsgtk_search_toggle_visibility(struct gtk_search *search)
+{
+       gboolean vis;
+
+       g_object_get(G_OBJECT(search->bar), "visible", &vis, NULL);
+       if (vis) {
+               
browser_window_search_clear(nsgtk_get_browser_window(search->gw));
+
+               gtk_widget_hide(GTK_WIDGET(search->bar));
+       } else {
+               gtk_widget_show(GTK_WIDGET(search->bar));
+               gtk_widget_grab_focus(GTK_WIDGET(search->entry));
+       }
+
+       return NSERROR_OK;
+}
+
+
+/* exported interface documented in gtk/search.h */
+nserror nsgtk_search_restyle(struct gtk_search *search)
+{
+       switch (nsoption_int(button_type)) {
+
+       case 1: /* Small icons */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_ICONS);
+               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
+                                         GTK_ICON_SIZE_SMALL_TOOLBAR);
+               break;
+
+       case 2: /* Large icons */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_ICONS);
+               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
+                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
+               break;
+
+       case 3: /* Large icons with text */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_BOTH);
+               gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar),
+                                         GTK_ICON_SIZE_LARGE_TOOLBAR);
+               break;
+
+       case 4: /* Text icons only */
+               gtk_toolbar_set_style(GTK_TOOLBAR(search->bar),
+                                     GTK_TOOLBAR_TEXT);
+       default:
+               break;
+       }
+       return NSERROR_OK;
+}
+
+
+/* exported interface documented in gtk/search.h */
+nserror
+nsgtk_search_create(GtkBuilder *builder,
+                   struct gtk_search **search_out,
+                   struct gui_window *gw)
+{
+       struct gtk_search *search;
+
+       search = malloc(sizeof(struct gtk_search));
+       if (search == NULL) {
+               return NSERROR_NOMEM;
+       }
+
+       search->gw = gw;
+
+       search->bar = GTK_TOOLBAR(gtk_builder_get_object(builder,
+                                                       "searchbar"));
+       search->entry = GTK_ENTRY(gtk_builder_get_object(builder,
+                                                       "searchEntry"));
+       search->back = GTK_TOOL_BUTTON(gtk_builder_get_object(builder,
+                                                       "searchBackButton"));
+       search->forward = GTK_TOOL_BUTTON(gtk_builder_get_object(builder,
+                                                       "searchForwardButton"));
+       search->close = GTK_TOOL_BUTTON(gtk_builder_get_object(builder,
+                                                       "closeSearchButton"));
+       search->checkAll = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
+                                                       "checkAllSearch"));
+       search->caseSens = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
+                                                       "caseSensButton"));
+
+       g_signal_connect(search->forward,
+                        "clicked",
+                        G_CALLBACK(nsgtk_search_forward_button_clicked),
+                        search);
+
+       g_signal_connect(search->back,
+                        "clicked",
+                        G_CALLBACK(nsgtk_search_back_button_clicked),
+                        search);
+
+       g_signal_connect(search->entry,
+                        "changed",
+                        G_CALLBACK(nsgtk_search_entry_changed),
+                        search);
+
+       g_signal_connect(search->entry,
+                        "activate",
+                        G_CALLBACK(nsgtk_search_entry_activate),
+                        search);
+
+       g_signal_connect(search->entry,
+                        "key-press-event",
+                        G_CALLBACK(nsgtk_search_entry_key),
+                        search);
+
+       g_signal_connect(search->close,
+                        "clicked",
+                        G_CALLBACK(nsgtk_search_close_button_clicked),
+                        search);
+
+       g_signal_connect(search->caseSens,
+                        "toggled",
+                        G_CALLBACK(nsgtk_search_entry_changed),
+                        search);
+
+       nsgtk_search_restyle(search);
+
+       *search_out = search;
+
+       return NSERROR_OK;
+}
diff --git a/frontends/gtk/search.h b/frontends/gtk/search.h
index 716a60d..b242c86 100644
--- a/frontends/gtk/search.h
+++ b/frontends/gtk/search.h
@@ -16,25 +16,47 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef _NETSURF_GTK_SEARCH_H_
-#define _NETSURF_GTK_SEARCH_H_
-
 /**
  * \file
  * free text page search for gtk interfaces
  */
 
+#ifndef NETSURF_GTK_SEARCH_H_
+#define NETSURF_GTK_SEARCH_H_
+
 extern struct gui_search_table *nsgtk_search_table;
 
 struct nsgtk_scaffolding;
 
-void nsgtk_search_bar_toggle_visibility(struct nsgtk_scaffolding * g);
-gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, 
gpointer data);
-gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data);
-gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data);
+struct gtk_search {
+       GtkToolbar *bar;
+       GtkEntry *entry;
+       GtkToolButton *back;
+       GtkToolButton *forward;
+       GtkToolButton *close;
+       GtkCheckButton *checkAll;
+       GtkCheckButton *caseSens;
+
+       struct gui_window *gw;
+};
+
+/**
+ * create text search context
+ *
+ * \param builder the gtk builder containing the search toolbar
+ * \param search_out search context result
+ * \return NSERROR_OK and search_out updated
+ */
+nserror nsgtk_search_create(GtkBuilder *builder, struct gtk_search 
**search_out, struct gui_window *gw);
+
+/**
+ * update search toolbar size and style
+ */
+nserror nsgtk_search_restyle(struct gtk_search *search);
+
+/**
+ * toggle search bar visibility
+ */
+nserror nsgtk_search_toggle_visibility(struct gtk_search *search);
 
-               
 #endif
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 8d6c092..0d868a0 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2009 Mark Benjamin <[email protected]>
+ * Copyright 2019 Vincent Sanders <[email protected]>
  *
  * This file is part of NetSurf, http://www.netsurf-browser.org/
  *
@@ -18,7 +18,7 @@
 
 /**
  * \file
- * implementatio of toolbar to control browsing context
+ * implementation of toolbar to control browsing context
  */
 
 #include <stdlib.h>
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 647f15f..a8badc4 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -62,6 +62,7 @@
 #include "gtk/bitmap.h"
 #include "gtk/gdk.h"
 #include "gtk/resources.h"
+#include "gtk/search.h"
 #include "gtk/window.h"
 
 static GtkWidget *select_menu;
@@ -99,6 +100,9 @@ struct gui_window {
        /** controls toolbar context */
        struct nsgtk_toolbar *toolbar;
 
+       /** search toolbar context */
+       struct gtk_search *search;
+
        /** The top level container (tabBox) */
        GtkWidget *container;
 
@@ -779,6 +783,7 @@ gui_window_create(struct browser_window *bw,
        g->input_method = gtk_im_multicontext_new();
 
 
+       /* create toolbar */
        res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g, &g->toolbar);
        if (res != NSERROR_OK) {
                free(g);
@@ -786,6 +791,13 @@ gui_window_create(struct browser_window *bw,
                return NULL;
        }
 
+       /* local page text search toolbar */
+       res = nsgtk_search_create(tab_builder, &g->search, g);
+       if (res != NSERROR_OK) {
+               free(g);
+               g_object_unref(tab_builder);
+               return NULL;
+       }
 
        /* set a default favicon */
        g_object_ref(favicon_pixbuf);
@@ -1468,6 +1480,13 @@ struct nsgtk_scaffolding *nsgtk_get_scaffold(struct 
gui_window *g)
 
 
 /* exported interface documented in window.h */
+struct gtk_search *nsgtk_window_get_search(struct gui_window *gw)
+{
+       return gw->search;
+}
+
+
+/* exported interface documented in window.h */
 struct browser_window *nsgtk_get_browser_window(struct gui_window *g)
 {
        return g->bw;
@@ -1490,6 +1509,14 @@ GtkLayout *nsgtk_window_get_layout(struct gui_window *g)
 
 /* exported interface documented in window.h */
 nserror
+nsgtk_window_search_toggle(struct gui_window *gw)
+{
+       return nsgtk_search_toggle_visibility(gw->search);
+}
+
+
+/* exported interface documented in window.h */
+nserror
 nsgtk_window_item_activate(struct gui_window *gw, nsgtk_toolbar_button itemid)
 {
        return nsgtk_toolbar_item_activate(gw->toolbar, itemid);
@@ -1511,7 +1538,7 @@ nserror nsgtk_window_update_all(void)
        for (gw = window_list; gw != NULL; gw = gw->next) {
                
nsgtk_tab_options_changed(nsgtk_scaffolding_notebook(gw->scaffold));
                nsgtk_toolbar_restyle(gw->toolbar);
-               /** \todo update search bar */
+               nsgtk_search_restyle(gw->search);
                browser_window_schedule_reformat(gw->bw);
        }
        return NSERROR_OK;
diff --git a/frontends/gtk/window.h b/frontends/gtk/window.h
index 9d8d16e..69b1cdc 100644
--- a/frontends/gtk/window.h
+++ b/frontends/gtk/window.h
@@ -85,6 +85,14 @@ void nsgtk_window_destroy_browser(struct gui_window *gw);
  */
 unsigned long nsgtk_window_get_signalhandler(struct gui_window *gw, int i);
 
+
+/**
+ * toggle search visibility
+ *
+ * \param gw gui window handle
+ */
+nserror nsgtk_window_search_toggle(struct gui_window *gw);
+
 /**
  * get gtk layout from gui handle
  *
@@ -94,6 +102,11 @@ GtkLayout *nsgtk_window_get_layout(struct gui_window *gw);
 
 
 /**
+ * get search from window handle
+ */
+struct gtk_search *nsgtk_window_get_search(struct gui_window *gw);
+
+/**
  * activate the handler for a item in a toolbar of a gui window
  *
  * \param gw The gui window handle


-- 
NetSurf Browser

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to