Gitweb links:

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

The branch, vince/gtk-tab-restyle has been updated
       via  daa9b2c014f598b391ed989324ee50736747963d (commit)
       via  976f80a0bf2c1e62521cd7631366e3a241e9bb7d (commit)
       via  80ea4e0ea3d914329938035cc6ac151a39fcea88 (commit)
      from  1015542ba6e3e9c07637505ab247cc61b98d38e5 (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=daa9b2c014f598b391ed989324ee50736747963d
commit daa9b2c014f598b391ed989324ee50736747963d
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    add home button clicked handler

diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 58611bd..c543eed 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -542,6 +542,108 @@ static char *remove_underscores(const char *s, bool 
replacespace)
 
 
 /**
+ * create throbber toolbar item widget
+ *
+ * create a gtk entry widget with a completion attached
+ */
+static GtkToolItem *
+make_toolbar_item_throbber(void)
+{
+       nserror res;
+       GtkToolItem *item;
+       GdkPixbuf *pixbuf;
+       GtkWidget *image;
+
+       res = nsgtk_throbber_get_frame(0, &pixbuf);
+       if (res != NSERROR_OK) {
+               return NULL;
+       }
+
+       if (edit_mode) {
+               item = gtk_tool_button_new(
+                               GTK_WIDGET(gtk_image_new_from_pixbuf(pixbuf)),
+                               "[throbber]");
+       } else {
+               item = gtk_tool_item_new();
+
+               image = gtk_image_new_from_pixbuf(pixbuf);
+               if (image != NULL) {
+                       nsgtk_widget_set_alignment(image,
+                                                  GTK_ALIGN_CENTER,
+                                                  GTK_ALIGN_CENTER);
+                       nsgtk_widget_set_margins(image, 3, 0);
+
+                       gtk_container_add(GTK_CONTAINER(item), image);
+               }
+       }
+       return item;
+}
+
+/**
+ * create url bar toolbar item widget
+ *
+ * create a gtk entry widget with a completion attached
+ */
+static GtkToolItem *
+make_toolbar_item_url_bar(void)
+{
+       GtkToolItem *item;
+       GtkWidget *entry;
+       GtkEntryCompletion *completion;
+
+       item = gtk_tool_item_new();
+       entry = nsgtk_entry_new();
+       completion = gtk_entry_completion_new();
+
+       if ((entry == NULL) || (completion == NULL) || (item == NULL)) {
+               return NULL;
+       }
+
+       gtk_entry_set_completion(GTK_ENTRY(entry), completion);
+       gtk_container_add(GTK_CONTAINER(item), entry);
+       gtk_tool_item_set_expand(item, TRUE);
+
+       return item;
+}
+
+
+/**
+ * create web search toolbar item widget
+ */
+static GtkToolItem *
+make_toolbar_item_websearch(void)
+{
+       GtkToolItem *item;
+
+       if (edit_mode) {
+               item = gtk_tool_button_new(
+                               GTK_WIDGET(nsgtk_image_new_from_stock(
+                                               NSGTK_STOCK_FIND,
+                                               GTK_ICON_SIZE_LARGE_TOOLBAR)),
+                               "[websearch]");
+       } else {
+               GtkWidget *entry = nsgtk_entry_new();
+
+               item = gtk_tool_item_new();
+
+               if ((entry == NULL) || (item == NULL)) {
+                       return NULL;
+               }
+
+               gtk_widget_set_size_request(entry, NSGTK_WEBSEARCH_WIDTH, -1);
+
+               nsgtk_entry_set_icon_from_stock(entry,
+                                               GTK_ENTRY_ICON_PRIMARY,
+                                               NSGTK_STOCK_INFO);
+
+               gtk_container_add(GTK_CONTAINER(item), entry);
+       }
+
+       return item;
+}
+
+
+/**
  * widget factory for creation of toolbar item widgets
  *
  * \param i the id of the widget
@@ -585,81 +687,17 @@ make_toolbar_item(nsgtk_toolbar_button i, struct 
nsgtk_theme *theme)
                                theme->image[HISTORY_BUTTON]), "H"));
                break;
 
-       case URL_BAR_ITEM: {
-               /* create a gtk entry widget with a completion attached */
-               GtkWidget *entry;
-               GtkEntryCompletion *completion;
-
-               w = GTK_WIDGET(gtk_tool_item_new());
-               entry = nsgtk_entry_new();
-               completion = gtk_entry_completion_new();
-
-               if ((entry == NULL) || (completion == NULL) || (w == NULL)) {
-                       nsgtk_warning(messages_get("NoMemory"), 0);
-                       return NULL;
-               }
-
-               gtk_entry_set_completion(GTK_ENTRY(entry), completion);
-               gtk_container_add(GTK_CONTAINER(w), entry);
-               gtk_tool_item_set_expand(GTK_TOOL_ITEM(w), TRUE);
+       case URL_BAR_ITEM:
+               w = GTK_WIDGET(make_toolbar_item_url_bar());
                break;
-       }
-
-       case THROBBER_ITEM: {
-               nserror res;
-               GdkPixbuf *pixbuf;
 
-               res = nsgtk_throbber_get_frame(0, &pixbuf);
-               if (res != NSERROR_OK) {
-                       return NULL;
-               }
-
-               if (edit_mode) {
-                       w = GTK_WIDGET(gtk_tool_button_new(
-                               GTK_WIDGET(gtk_image_new_from_pixbuf(pixbuf)),
-                               "[throbber]"));
-               } else {
-                       GtkWidget *image;
-
-                       w = GTK_WIDGET(gtk_tool_item_new());
-
-                       image = gtk_image_new_from_pixbuf(pixbuf);
-                       if (image != NULL) {
-                               nsgtk_widget_set_alignment(image,
-                                                          GTK_ALIGN_CENTER,
-                                                          GTK_ALIGN_CENTER);
-                               nsgtk_widget_set_margins(image, 3, 0);
-
-                               gtk_container_add(GTK_CONTAINER(w), image);
-                       }
-               }
+       case THROBBER_ITEM:
+               w = GTK_WIDGET(make_toolbar_item_throbber());
                break;
-       }
-
-       case WEBSEARCH_ITEM: {
-               if (edit_mode)
-                       return GTK_WIDGET(gtk_tool_button_new(GTK_WIDGET(
-                                       
nsgtk_image_new_from_stock(NSGTK_STOCK_FIND,
-                                       GTK_ICON_SIZE_LARGE_TOOLBAR)),
-                                       "[websearch]"));
-
-               GtkWidget *entry = nsgtk_entry_new();
-
-               w = GTK_WIDGET(gtk_tool_item_new());
-
-               if ((entry == NULL) || (w == NULL)) {
-                       nsgtk_warning(messages_get("NoMemory"), 0);
-                       return NULL;
-               }
-
-               gtk_widget_set_size_request(entry, NSGTK_WEBSEARCH_WIDTH, -1);
-
-               nsgtk_entry_set_icon_from_stock(entry, GTK_ENTRY_ICON_PRIMARY,
-                                               NSGTK_STOCK_INFO);
 
-               gtk_container_add(GTK_CONTAINER(w), entry);
+       case WEBSEARCH_ITEM:
+               w = GTK_WIDGET(make_toolbar_item_websearch());
                break;
-       }
 
 /* gtk_tool_button_new accepts NULL args */
 #define MAKE_MENUBUTTON(p, q)                                          \
@@ -723,6 +761,11 @@ make_toolbar_item(nsgtk_toolbar_button i, struct 
nsgtk_theme *theme)
                break;
 
        }
+
+       if (w == NULL) {
+               nsgtk_warning(messages_get("NoMemory"), 0);
+       }
+
        return w;
 }
 
@@ -1926,6 +1969,47 @@ reload_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 }
 
 
+/**
+ * handler for home tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+home_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       nserror res;
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       const char *addr;
+       struct browser_window *bw;
+       nsurl *url;
+
+       if (nsoption_charp(homepage_url) != NULL) {
+               addr = nsoption_charp(homepage_url);
+       } else {
+               addr = NETSURF_HOMEPAGE;
+       }
+
+       res = nsurl_create(addr, &url);
+       if (res == NSERROR_OK) {
+               bw = tb->get_bw(tb->get_bw_ctx);
+
+               res = browser_window_navigate(bw,
+                                             url,
+                                             NULL,
+                                             BW_NAVIGATE_HISTORY,
+                                             NULL,
+                                             NULL,
+                                             NULL);
+               nsurl_unref(url);
+       }
+       if (res != NSERROR_OK) {
+               nsgtk_warning(messages_get_errorcode(res), 0);
+       }
+
+       return TRUE;
+}
 
 
 /**
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index d82ca22..5281ab6 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -93,7 +93,7 @@ TOOLBAR_ITEM(HISTORY_BUTTON, history, true, 
localhistory_button_clicked_cb)
 TOOLBAR_ITEM(FORWARD_BUTTON, forward, false, forward_button_clicked_cb)
 TOOLBAR_ITEM(STOP_BUTTON, stop, false, stop_button_clicked_cb)
 TOOLBAR_ITEM(RELOAD_BUTTON, reload, true, reload_button_clicked_cb)
-TOOLBAR_ITEM(HOME_BUTTON, home, true, NULL)
+TOOLBAR_ITEM(HOME_BUTTON, home, true, home_button_clicked_cb)
 TOOLBAR_ITEM(URL_BAR_ITEM, url_bar, true, NULL)
 TOOLBAR_ITEM(WEBSEARCH_ITEM, websearch, true, NULL)
 TOOLBAR_ITEM(THROBBER_ITEM, throbber, true, NULL)


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

    implement several more button press handlers

diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 5c57011..b523645 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -54,6 +54,7 @@
 #include "gtk/compat.h"
 #include "gtk/warn.h"
 #include "gtk/cookies.h"
+#include "gtk/completion.h"
 #include "gtk/preferences.h"
 #include "gtk/about.h"
 #include "gtk/viewsource.h"
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index 49e0af3..58611bd 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -27,7 +27,9 @@
 #include <gtk/gtk.h>
 
 #include "netsurf/browser_window.h"
+#include "desktop/browser_history.h"
 #include "desktop/searchweb.h"
+#include "desktop/search.h"
 #include "utils/log.h"
 #include "utils/messages.h"
 #include "utils/nsoption.h"
@@ -46,6 +48,7 @@
 #include "gtk/toolbar_items.h"
 #include "gtk/toolbar.h"
 #include "gtk/schedule.h"
+#include "gtk/local_history.h"
 
 /**
  * button location indicating button is not to be shown
@@ -64,8 +67,13 @@ struct nsgtk_toolbar_item {
        GtkToolItem *button;
        int         location; /* in toolbar */
        bool        sensitivity;
+
+       /**
+        * button clicked handler
+        */
+       gboolean (*bhandler)(GtkWidget *widget, gpointer data);
+
        void        *mhandler; /* menu item clicked */
-       void        *bhandler; /* button clicked */
        void        *dataplus; /* customization -> toolbar */
        void        *dataminus; /* customization -> store */
 };
@@ -1662,6 +1670,28 @@ itemid_from_gtktoolitem(struct nsgtk_toolbar *tb, 
GtkToolItem *toolitem)
 
 
 /**
+ * set a toolbar items sensitivity
+ *
+ * note this does not set menu items sensitivity
+ */
+static nserror
+set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
+{
+       if (item->sensitivity != sensitivity) {
+               /* item requires sensitivity changing */
+               item->sensitivity = sensitivity;
+
+               if ((item->location != -1) && (item->button != NULL)) {
+                       gtk_widget_set_sensitive(GTK_WIDGET(item->button),
+                                                item->sensitivity);
+               }
+       }
+
+       return NSERROR_OK;
+}
+
+
+/**
  * callback for all toolbar items widget size allocation
  *
  * handler connected to all toolbar items for the size-allocate signal
@@ -1763,6 +1793,38 @@ url_entry_changed_cb(GtkWidget *widget, GdkEventKey 
*event, gpointer data)
 
 
 /**
+ * handler for back tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+back_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
+
+       if ((bw != NULL) && browser_window_history_back_available(bw)) {
+               /* clear potential search effects */
+               browser_window_search_clear(bw);
+
+               browser_window_history_back(bw, false);
+
+               set_item_sensitivity(tb->buttons[BACK_BUTTON],
+                               browser_window_history_back_available(bw));
+               set_item_sensitivity(tb->buttons[FORWARD_BUTTON],
+                               browser_window_history_forward_available(bw));
+
+               nsgtk_local_history_hide();
+       }
+       return TRUE;
+}
+
+
+/**
  * handler for local history tool bar item clicked signal
  *
  * \param widget The widget the signal is being delivered to.
@@ -1777,12 +1839,46 @@ localhistory_button_clicked_cb(GtkWidget *widget, 
gpointer data)
        struct browser_window *bw;
        GtkWidget *toplevel;
 
-       toplevel = gtk_widget_get_toplevel(widget);
+       toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+       if (toplevel != NULL) {
+               bw = tb->get_bw(tb->get_bw_ctx);
+
+               res = nsgtk_local_history_present(GTK_WINDOW(toplevel), bw);
+               if (res != NSERROR_OK) {
+                       NSLOG(netsurf, INFO,
+                             "Unable to present local history window.");
+               }
+       }
+       return TRUE;
+}
+
+
+/**
+ * handler for forward tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+forward_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+
        bw = tb->get_bw(tb->get_bw_ctx);
 
-       res = nsgtk_local_history_present(toplevel, bw);
-       if (res != NSERROR_OK) {
-               NSLOG(netsurf, INFO, "Unable to present local history window.");
+       if ((bw != NULL) && browser_window_history_forward_available(bw)) {
+               /* clear potential search effects */
+               browser_window_search_clear(bw);
+
+               browser_window_history_forward(bw, false);
+
+               set_item_sensitivity(tb->buttons[BACK_BUTTON],
+                               browser_window_history_back_available(bw));
+               set_item_sensitivity(tb->buttons[FORWARD_BUTTON],
+                               browser_window_history_forward_available(bw));
+               nsgtk_local_history_hide();
        }
        return TRUE;
 }
@@ -1805,6 +1901,33 @@ stop_button_clicked_cb(GtkWidget *widget, gpointer data)
        return TRUE;
 }
 
+
+/**
+ * handler for reload tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+reload_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
+
+       /* clear potential search effects */
+       browser_window_search_clear(bw);
+
+       browser_window_reload(bw, true);
+
+       return TRUE;
+}
+
+
+
+
 /**
  * create a toolbar item
  *
@@ -1842,28 +1965,6 @@ toolbar_item_create(nsgtk_toolbar_button id,
        return NSERROR_OK;
 }
 
-/**
- * set a toolbar items sensitivity
- *
- * note this does not set menu items sensitivity
- */
-static nserror
-set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
-{
-       if (item->sensitivity == sensitivity) {
-               /* item does not require sensitivity changing */
-               return NSERROR_OK;
-       }
-       item->sensitivity = sensitivity;
-
-       if ((item->location != -1) && (item->button != NULL)) {
-               gtk_widget_set_sensitive(GTK_WIDGET(item->button),
-                                        item->sensitivity);
-       }
-
-       return NSERROR_OK;
-
-}
 
 /**
  * set a toolbar item to a throbber frame number
@@ -2121,6 +2222,9 @@ nserror nsgtk_toolbar_update(struct nsgtk_toolbar *tb)
 nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
 {
        nserror res;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
 
        /* when activating the throbber simply schedule the next frame update */
        if (active) {
@@ -2141,6 +2245,11 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, 
bool active)
        /* adjust sensitivity of other items */
        set_item_sensitivity(tb->buttons[STOP_BUTTON], false);
        set_item_sensitivity(tb->buttons[RELOAD_BUTTON], true);
+       set_item_sensitivity(tb->buttons[BACK_BUTTON],
+                            browser_window_history_back_available(bw));
+       set_item_sensitivity(tb->buttons[FORWARD_BUTTON],
+                            browser_window_history_forward_available(bw));
+       nsgtk_local_history_hide();
 
        return res;
 }
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index 5c6033c..d82ca22 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -88,11 +88,11 @@ typedef enum {
 #define TOOLBAR_ITEM_SET
 #endif
 
-TOOLBAR_ITEM(BACK_BUTTON, back, false, NULL)
+TOOLBAR_ITEM(BACK_BUTTON, back, false, back_button_clicked_cb)
 TOOLBAR_ITEM(HISTORY_BUTTON, history, true, localhistory_button_clicked_cb)
-TOOLBAR_ITEM(FORWARD_BUTTON, forward, false, NULL)
+TOOLBAR_ITEM(FORWARD_BUTTON, forward, false, forward_button_clicked_cb)
 TOOLBAR_ITEM(STOP_BUTTON, stop, false, stop_button_clicked_cb)
-TOOLBAR_ITEM(RELOAD_BUTTON, reload, true, NULL)
+TOOLBAR_ITEM(RELOAD_BUTTON, reload, true, reload_button_clicked_cb)
 TOOLBAR_ITEM(HOME_BUTTON, home, true, NULL)
 TOOLBAR_ITEM(URL_BAR_ITEM, url_bar, true, NULL)
 TOOLBAR_ITEM(WEBSEARCH_ITEM, websearch, true, NULL)


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

    connect button clicked events for local history and stop buttons

diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index a17ffd3..49e0af3 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -92,9 +92,6 @@ struct nsgtk_toolbar {
        /** entry widget holding the url of the current displayed page */
        GtkWidget *url_bar;
 
-       /** Completions for url_bar */
-       GtkEntryCompletion *url_bar_completion;
-
        /** Current frame of throbber animation */
        int throb_frame;
 
@@ -173,7 +170,7 @@ struct nsgtk_theme {
 
 
 /* define data plus and data minus handlers */
-#define TOOLBAR_ITEM(identifier, name, sensitivity)                    \
+#define TOOLBAR_ITEM(identifier, name, sensitivity, clicked)           \
 static gboolean                                                                
\
 nsgtk_toolbar_##name##_data_plus(GtkWidget *widget,                    \
                                 GdkDragContext *cont,                  \
@@ -594,7 +591,7 @@ make_toolbar_item(nsgtk_toolbar_button i, struct 
nsgtk_theme *theme)
                        return NULL;
                }
 
-               gtk_entry_set_completion(entry, completion);
+               gtk_entry_set_completion(GTK_ENTRY(entry), completion);
                gtk_container_add(GTK_CONTAINER(w), entry);
                gtk_tool_item_set_expand(GTK_TOOL_ITEM(w), TRUE);
                break;
@@ -658,14 +655,16 @@ make_toolbar_item(nsgtk_toolbar_button i, struct 
nsgtk_theme *theme)
 
 /* gtk_tool_button_new accepts NULL args */
 #define MAKE_MENUBUTTON(p, q)                                          \
-               case p##_BUTTON: {                                      \
-                       char *label = NULL;                             \
-                       label = remove_underscores(messages_get(#q), false); \
-                       w = GTK_WIDGET(gtk_tool_button_new(GTK_WIDGET(  \
-                                          theme->image[p##_BUTTON]), label)); \
-                       if (label != NULL)                              \
-                               free(label);                            \
-                       break;                                          \
+       case p##_BUTTON: {                                              \
+               char *label = NULL;                                     \
+               label = remove_underscores(messages_get(#q), false);    \
+               w = GTK_WIDGET(gtk_tool_button_new(                     \
+                                       GTK_WIDGET(theme->image[p##_BUTTON]), \
+                                       label));                        \
+               if (label != NULL) {                                    \
+                       free(label);                                    \
+               }                                                       \
+               break;                                                  \
        }
 
        MAKE_MENUBUTTON(NEWWINDOW, gtkNewWindow)
@@ -1414,17 +1413,6 @@ int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget,
        return -1;
 }
 
-/* exported interface documented in gtk/scaffolding.h */
-static void nsgtk_scaffolding_update_url_bar_ref(struct nsgtk_scaffolding *g)
-{
-       #if 0
-       g->url_bar = GTK_WIDGET(gtk_bin_get_child(GTK_BIN(
-                       g->buttons[URL_BAR_ITEM]->button)));
-
-       gtk_entry_set_completion(GTK_ENTRY(g->url_bar),
-                       g->url_bar_completion);
-       #endif
-}
 
 /**
  * add handlers to factory widgets
@@ -1436,7 +1424,6 @@ nsgtk_toolbar_set_handler(struct nsgtk_scaffolding *g, 
nsgtk_toolbar_button i)
 {
        switch(i) {
        case URL_BAR_ITEM:
-               nsgtk_scaffolding_update_url_bar_ref(g);
                g_signal_connect(GTK_WIDGET(nsgtk_scaffolding_urlbar(g)),
                                 "activate", G_CALLBACK(
                                         nsgtk_window_url_activate_event), g);
@@ -1633,125 +1620,6 @@ static nserror populate_gtk_toolbar_widget(struct 
nsgtk_toolbar *tb)
        return NSERROR_OK;
 }
 
-/**
- * create a toolbar item
- *
- * create a toolbar item and set up its default handlers
- */
-static nserror
-toolbar_item_create(nsgtk_toolbar_button id,
-                   struct nsgtk_toolbar_item **item_out)
-{
-       struct nsgtk_toolbar_item *item;
-       item = calloc(1, sizeof(struct nsgtk_toolbar_item));
-       if (item == NULL) {
-               return NSERROR_NOMEM;
-       }
-       item->location = INACTIVE_LOCATION;
-
-       switch (id) {
-#define TOOLBAR_ITEM(identifier, name, snstvty)                                
\
-       case identifier:                                                \
-               item->sensitivity = snstvty;                            \
-               item->dataplus = nsgtk_toolbar_##name##_data_plus;      \
-               item->dataminus = nsgtk_toolbar_##name##_data_minus;    \
-               break;
-#include "gtk/toolbar_items.h"
-#undef TOOLBAR_ITEM
-
-       case PLACEHOLDER_BUTTON:
-               free(item);
-               return NSERROR_INVALID;
-       }
-
-       *item_out = item;
-       return NSERROR_OK;
-}
-
-/**
- * set a toolbar items sensitivity
- *
- * note this does not set menu items sensitivity
- */
-static nserror
-set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
-{
-       if (item->sensitivity == sensitivity) {
-               /* item does not require sensitivity changing */
-               return NSERROR_OK;
-       }
-       item->sensitivity = sensitivity;
-
-       if ((item->location != -1) && (item->button != NULL)) {
-               gtk_widget_set_sensitive(GTK_WIDGET(item->button),
-                                        item->sensitivity);
-       }
-
-       return NSERROR_OK;
-
-}
-
-/**
- * set a toolbar item to a throbber frame number
- *
- * \param toolbar_item The toolbar item to update
- * \param frame The animation frame number to update to
- * \return NSERROR_OK on success,
- *         NSERROR_INVALID if the toolbar item does not contain an image,
- *         NSERROR_BAD_SIZE if the frame is out of range.
- */
-static nserror set_throbber_frame(GtkToolItem *toolbar_item, int frame)
-{
-       nserror res;
-       GdkPixbuf *pixbuf;
-       GtkImage *throbber;
-
-       if (toolbar_item == NULL) {
-               /* no toolbar item */
-               return NSERROR_INVALID;
-       }
-
-       res = nsgtk_throbber_get_frame(frame, &pixbuf);
-       if (res != NSERROR_OK) {
-               return res;
-       }
-
-       throbber = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(toolbar_item)));
-
-       gtk_image_set_from_pixbuf(throbber, pixbuf);
-
-       return NSERROR_OK;
-}
-
-
-/**
- * Make the throbber run.
- *
- * scheduled callback to update the throbber
- *
- * \param p The context passed when scheduled.
- */
-static void next_throbber_frame(void *p)
-{
-       struct nsgtk_toolbar *tb = p;
-       nserror res;
-
-       tb->throb_frame++; /* advance to next frame */
-
-       res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
-                                tb->throb_frame);
-       if (res == NSERROR_BAD_SIZE) {
-               tb->throb_frame = 1;
-               res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
-                                        tb->throb_frame);
-       }
-
-       /* only schedule next frame if there are no errors */
-       if (res == NSERROR_OK) {
-               nsgtk_schedule(THROBBER_FRAME_TIME, next_throbber_frame, p);
-       }
-}
-
 
 /**
  * find the toolbar item with a given location.
@@ -1876,6 +1744,7 @@ static gboolean url_entry_activate_cb(GtkWidget *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * callback for url entry widget changing
  *
@@ -1893,11 +1762,183 @@ url_entry_changed_cb(GtkWidget *widget, GdkEventKey 
*event, gpointer data)
 }
 
 
+/**
+ * handler for local history tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+localhistory_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       nserror res;
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+       GtkWidget *toplevel;
+
+       toplevel = gtk_widget_get_toplevel(widget);
+       bw = tb->get_bw(tb->get_bw_ctx);
+
+       res = nsgtk_local_history_present(toplevel, bw);
+       if (res != NSERROR_OK) {
+               NSLOG(netsurf, INFO, "Unable to present local history window.");
+       }
+       return TRUE;
+}
+
+
+/**
+ * handler for stop tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+stop_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+
+       browser_window_stop(tb->get_bw(tb->get_bw_ctx));
+
+       return TRUE;
+}
+
+/**
+ * create a toolbar item
+ *
+ * create a toolbar item and set up its default handlers
+ */
+static nserror
+toolbar_item_create(nsgtk_toolbar_button id,
+                   struct nsgtk_toolbar_item **item_out)
+{
+       struct nsgtk_toolbar_item *item;
+       item = calloc(1, sizeof(struct nsgtk_toolbar_item));
+       if (item == NULL) {
+               return NSERROR_NOMEM;
+       }
+       item->location = INACTIVE_LOCATION;
+
+       /* set item defaults from macro */
+       switch (id) {
+#define TOOLBAR_ITEM(identifier, name, snstvty, clicked)               \
+       case identifier:                                                \
+               item->sensitivity = snstvty;                            \
+               item->dataplus = nsgtk_toolbar_##name##_data_plus;      \
+               item->dataminus = nsgtk_toolbar_##name##_data_minus;    \
+               item->bhandler = clicked;                               \
+               break;
+#include "gtk/toolbar_items.h"
+#undef TOOLBAR_ITEM
+
+       case PLACEHOLDER_BUTTON:
+               free(item);
+               return NSERROR_INVALID;
+       }
+
+       *item_out = item;
+       return NSERROR_OK;
+}
+
+/**
+ * set a toolbar items sensitivity
+ *
+ * note this does not set menu items sensitivity
+ */
+static nserror
+set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
+{
+       if (item->sensitivity == sensitivity) {
+               /* item does not require sensitivity changing */
+               return NSERROR_OK;
+       }
+       item->sensitivity = sensitivity;
+
+       if ((item->location != -1) && (item->button != NULL)) {
+               gtk_widget_set_sensitive(GTK_WIDGET(item->button),
+                                        item->sensitivity);
+       }
+
+       return NSERROR_OK;
+
+}
+
+/**
+ * set a toolbar item to a throbber frame number
+ *
+ * \param toolbar_item The toolbar item to update
+ * \param frame The animation frame number to update to
+ * \return NSERROR_OK on success,
+ *         NSERROR_INVALID if the toolbar item does not contain an image,
+ *         NSERROR_BAD_SIZE if the frame is out of range.
+ */
+static nserror set_throbber_frame(GtkToolItem *toolbar_item, int frame)
+{
+       nserror res;
+       GdkPixbuf *pixbuf;
+       GtkImage *throbber;
+
+       if (toolbar_item == NULL) {
+               /* no toolbar item */
+               return NSERROR_INVALID;
+       }
+
+       res = nsgtk_throbber_get_frame(frame, &pixbuf);
+       if (res != NSERROR_OK) {
+               return res;
+       }
+
+       throbber = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(toolbar_item)));
+
+       gtk_image_set_from_pixbuf(throbber, pixbuf);
+
+       return NSERROR_OK;
+}
+
+
+/**
+ * Make the throbber run.
+ *
+ * scheduled callback to update the throbber
+ *
+ * \param p The context passed when scheduled.
+ */
+static void next_throbber_frame(void *p)
+{
+       struct nsgtk_toolbar *tb = p;
+       nserror res;
+
+       tb->throb_frame++; /* advance to next frame */
+
+       res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
+                                tb->throb_frame);
+       if (res == NSERROR_BAD_SIZE) {
+               tb->throb_frame = 1;
+               res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
+                                        tb->throb_frame);
+       }
+
+       /* only schedule next frame if there are no errors */
+       if (res == NSERROR_OK) {
+               nsgtk_schedule(THROBBER_FRAME_TIME, next_throbber_frame, p);
+       }
+}
+
+
+/**
+ * connect signal handlers to a gtk toolbar item
+ */
 static nserror
 toolbar_connect_signal(struct nsgtk_toolbar *tb, nsgtk_toolbar_button itemid)
 {
-       if (tb->buttons[itemid]->button != NULL) {
-               g_signal_connect(tb->buttons[itemid]->button,
+       struct nsgtk_toolbar_item *item;
+
+       item = tb->buttons[itemid];
+
+       if (item->button != NULL) {
+               g_signal_connect(item->button,
                                 "size-allocate",
                                 G_CALLBACK(toolbar_item_size_allocate_cb),
                                 tb);
@@ -1906,8 +1947,7 @@ toolbar_connect_signal(struct nsgtk_toolbar *tb, 
nsgtk_toolbar_button itemid)
        switch (itemid) {
        case URL_BAR_ITEM: {
                GtkEntry *url_entry;
-               url_entry = GTK_ENTRY(gtk_bin_get_child(
-                                       GTK_BIN(tb->buttons[itemid]->button)));
+               url_entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(item->button)));
                g_signal_connect(GTK_WIDGET(url_entry),
                                 "activate",
                                 G_CALLBACK(url_entry_activate_cb),
@@ -1922,6 +1962,16 @@ toolbar_connect_signal(struct nsgtk_toolbar *tb, 
nsgtk_toolbar_button itemid)
                                                tb->get_bw_ctx);
                break;
        }
+
+       default:
+               if ((item->bhandler != NULL) && (item->button != NULL)) {
+                       g_signal_connect(item->button,
+                                        "clicked",
+                                        G_CALLBACK(item->bhandler),
+                                        tb);
+               }
+               break;
+
        }
 
        return NSERROR_OK;
@@ -1965,8 +2015,11 @@ nsgtk_toolbar_create(GtkBuilder *builder,
 
        tb->get_bw = get_bw;
        tb->get_bw_ctx = get_bw_ctx;
+       /* set the throbber start frame. */
+       tb->throb_frame = 0;
 
        tb->widget = GTK_TOOLBAR(gtk_builder_get_object(builder, "toolbar"));
+       gtk_toolbar_set_show_arrow(tb->widget, TRUE);
 
        /* allocate button contexts */
        for (bidx = BACK_BUTTON; bidx < PLACEHOLDER_BUTTON; bidx++) {
@@ -1998,7 +2051,6 @@ nsgtk_toolbar_create(GtkBuilder *builder,
                return res;
        }
 
-       gtk_toolbar_set_show_arrow(tb->widget, TRUE);
        gtk_widget_show_all(GTK_WIDGET(tb->widget));
 
        /* if there is a history widget set its size */
@@ -2007,9 +2059,6 @@ nsgtk_toolbar_create(GtkBuilder *builder,
                        tb->buttons[HISTORY_BUTTON]->button), 20, -1);
        }
 
-       /* set the throbber start frame. */
-       tb->throb_frame = 0;
-
        res = toolbar_connect_signals(tb);
        if (res != NSERROR_OK) {
                free(tb);
diff --git a/frontends/gtk/toolbar.h b/frontends/gtk/toolbar.h
index 9c410d1..f04d807 100644
--- a/frontends/gtk/toolbar.h
+++ b/frontends/gtk/toolbar.h
@@ -32,8 +32,7 @@ struct nsgtk_toolbar;
  * \param[out] toolbar a pointer to receive the result.
  * \return NSERROR_OK and toolbar updated on success else error code
  */
-nserror nsgtk_toolbar_create(GtkBuilder *builder, struct browser_window 
*(*get_bw)(void *ctx),
-                    void *get_bw_ctx,struct nsgtk_toolbar **toolbar);
+nserror nsgtk_toolbar_create(GtkBuilder *builder, struct browser_window 
*(*get_bw)(void *ctx), void *get_bw_ctx,struct nsgtk_toolbar **toolbar);
 
 
 /**
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index 0e1eae4..5c6033c 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -84,61 +84,61 @@ typedef enum {
  */
 
 #ifndef TOOLBAR_ITEM
-#define TOOLBAR_ITEM(a, b, c)
+#define TOOLBAR_ITEM(a, b, c, d)
 #define TOOLBAR_ITEM_SET
 #endif
 
-TOOLBAR_ITEM(BACK_BUTTON, back, false)
-TOOLBAR_ITEM(HISTORY_BUTTON, history, true)
-TOOLBAR_ITEM(FORWARD_BUTTON, forward, false)
-TOOLBAR_ITEM(STOP_BUTTON, stop, false)
-TOOLBAR_ITEM(RELOAD_BUTTON, reload, true)
-TOOLBAR_ITEM(HOME_BUTTON, home, true)
-TOOLBAR_ITEM(URL_BAR_ITEM, url_bar, true)
-TOOLBAR_ITEM(WEBSEARCH_ITEM, websearch, true)
-TOOLBAR_ITEM(THROBBER_ITEM, throbber, true)
-TOOLBAR_ITEM(NEWWINDOW_BUTTON, newwindow, true)
-TOOLBAR_ITEM(NEWTAB_BUTTON, newtab, true)
-TOOLBAR_ITEM(OPENFILE_BUTTON, openfile, true)
-TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false)
-TOOLBAR_ITEM(CLOSEWINDOW_BUTTON, closewindow, true)
-TOOLBAR_ITEM(SAVEPAGE_BUTTON, savepage, true)
-TOOLBAR_ITEM(PDF_BUTTON, pdf, false)
-TOOLBAR_ITEM(PLAINTEXT_BUTTON, plaintext, true)
-TOOLBAR_ITEM(DRAWFILE_BUTTON, drawfile, false)
-TOOLBAR_ITEM(POSTSCRIPT_BUTTON, postscript, false)
-TOOLBAR_ITEM(PRINTPREVIEW_BUTTON, printpreview, false)
-TOOLBAR_ITEM(PRINT_BUTTON, print, true)
-TOOLBAR_ITEM(QUIT_BUTTON, quit, true)
-TOOLBAR_ITEM(CUT_BUTTON, cut, true)
-TOOLBAR_ITEM(COPY_BUTTON, copy, true)
-TOOLBAR_ITEM(PASTE_BUTTON, paste, true)
-TOOLBAR_ITEM(DELETE_BUTTON, delete, false)
-TOOLBAR_ITEM(SELECTALL_BUTTON, selectall, true)
-TOOLBAR_ITEM(FIND_BUTTON, find, true)
-TOOLBAR_ITEM(PREFERENCES_BUTTON, preferences, true)
-TOOLBAR_ITEM(ZOOMPLUS_BUTTON, zoomplus, true)
-TOOLBAR_ITEM(ZOOMMINUS_BUTTON, zoomminus, true)
-TOOLBAR_ITEM(ZOOMNORMAL_BUTTON, zoomnormal, true)
-TOOLBAR_ITEM(FULLSCREEN_BUTTON, fullscreen, true)
-TOOLBAR_ITEM(VIEWSOURCE_BUTTON, viewsource, true)
-TOOLBAR_ITEM(DOWNLOADS_BUTTON, downloads, true)
-TOOLBAR_ITEM(SAVEWINDOWSIZE_BUTTON, savewindowsize, true)
-TOOLBAR_ITEM(TOGGLEDEBUGGING_BUTTON, toggledebugging, true)
-TOOLBAR_ITEM(SAVEBOXTREE_BUTTON, debugboxtree, true)
-TOOLBAR_ITEM(SAVEDOMTREE_BUTTON, debugdomtree, true)
-TOOLBAR_ITEM(LOCALHISTORY_BUTTON, localhistory, true)
-TOOLBAR_ITEM(GLOBALHISTORY_BUTTON, globalhistory, true)
-TOOLBAR_ITEM(ADDBOOKMARKS_BUTTON, addbookmarks, true)
-TOOLBAR_ITEM(SHOWBOOKMARKS_BUTTON, showbookmarks, true)
-TOOLBAR_ITEM(SHOWCOOKIES_BUTTON, showcookies, true)
-TOOLBAR_ITEM(OPENLOCATION_BUTTON, openlocation, true)
-TOOLBAR_ITEM(NEXTTAB_BUTTON, nexttab, false)
-TOOLBAR_ITEM(PREVTAB_BUTTON, prevtab, false)
-TOOLBAR_ITEM(CONTENTS_BUTTON, contents, true)
-TOOLBAR_ITEM(GUIDE_BUTTON, guide, true)
-TOOLBAR_ITEM(INFO_BUTTON, info, true)
-TOOLBAR_ITEM(ABOUT_BUTTON, about, true)
+TOOLBAR_ITEM(BACK_BUTTON, back, false, NULL)
+TOOLBAR_ITEM(HISTORY_BUTTON, history, true, localhistory_button_clicked_cb)
+TOOLBAR_ITEM(FORWARD_BUTTON, forward, false, NULL)
+TOOLBAR_ITEM(STOP_BUTTON, stop, false, stop_button_clicked_cb)
+TOOLBAR_ITEM(RELOAD_BUTTON, reload, true, NULL)
+TOOLBAR_ITEM(HOME_BUTTON, home, true, NULL)
+TOOLBAR_ITEM(URL_BAR_ITEM, url_bar, true, NULL)
+TOOLBAR_ITEM(WEBSEARCH_ITEM, websearch, true, NULL)
+TOOLBAR_ITEM(THROBBER_ITEM, throbber, true, NULL)
+TOOLBAR_ITEM(NEWWINDOW_BUTTON, newwindow, true, NULL)
+TOOLBAR_ITEM(NEWTAB_BUTTON, newtab, true, NULL)
+TOOLBAR_ITEM(OPENFILE_BUTTON, openfile, true, NULL)
+TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false, NULL)
+TOOLBAR_ITEM(CLOSEWINDOW_BUTTON, closewindow, true, NULL)
+TOOLBAR_ITEM(SAVEPAGE_BUTTON, savepage, true, NULL)
+TOOLBAR_ITEM(PDF_BUTTON, pdf, false, NULL)
+TOOLBAR_ITEM(PLAINTEXT_BUTTON, plaintext, true, NULL)
+TOOLBAR_ITEM(DRAWFILE_BUTTON, drawfile, false, NULL)
+TOOLBAR_ITEM(POSTSCRIPT_BUTTON, postscript, false, NULL)
+TOOLBAR_ITEM(PRINTPREVIEW_BUTTON, printpreview, false, NULL)
+TOOLBAR_ITEM(PRINT_BUTTON, print, true, NULL)
+TOOLBAR_ITEM(QUIT_BUTTON, quit, true, NULL)
+TOOLBAR_ITEM(CUT_BUTTON, cut, true, NULL)
+TOOLBAR_ITEM(COPY_BUTTON, copy, true, NULL)
+TOOLBAR_ITEM(PASTE_BUTTON, paste, true, NULL)
+TOOLBAR_ITEM(DELETE_BUTTON, delete, false, NULL)
+TOOLBAR_ITEM(SELECTALL_BUTTON, selectall, true, NULL)
+TOOLBAR_ITEM(FIND_BUTTON, find, true, NULL)
+TOOLBAR_ITEM(PREFERENCES_BUTTON, preferences, true, NULL)
+TOOLBAR_ITEM(ZOOMPLUS_BUTTON, zoomplus, true, NULL)
+TOOLBAR_ITEM(ZOOMMINUS_BUTTON, zoomminus, true, NULL)
+TOOLBAR_ITEM(ZOOMNORMAL_BUTTON, zoomnormal, true, NULL)
+TOOLBAR_ITEM(FULLSCREEN_BUTTON, fullscreen, true, NULL)
+TOOLBAR_ITEM(VIEWSOURCE_BUTTON, viewsource, true, NULL)
+TOOLBAR_ITEM(DOWNLOADS_BUTTON, downloads, true, NULL)
+TOOLBAR_ITEM(SAVEWINDOWSIZE_BUTTON, savewindowsize, true, NULL)
+TOOLBAR_ITEM(TOGGLEDEBUGGING_BUTTON, toggledebugging, true, NULL)
+TOOLBAR_ITEM(SAVEBOXTREE_BUTTON, debugboxtree, true, NULL)
+TOOLBAR_ITEM(SAVEDOMTREE_BUTTON, debugdomtree, true, NULL)
+TOOLBAR_ITEM(LOCALHISTORY_BUTTON, localhistory, true, 
localhistory_button_clicked_cb)
+TOOLBAR_ITEM(GLOBALHISTORY_BUTTON, globalhistory, true, NULL)
+TOOLBAR_ITEM(ADDBOOKMARKS_BUTTON, addbookmarks, true, NULL)
+TOOLBAR_ITEM(SHOWBOOKMARKS_BUTTON, showbookmarks, true, NULL)
+TOOLBAR_ITEM(SHOWCOOKIES_BUTTON, showcookies, true, NULL)
+TOOLBAR_ITEM(OPENLOCATION_BUTTON, openlocation, true, NULL)
+TOOLBAR_ITEM(NEXTTAB_BUTTON, nexttab, false, NULL)
+TOOLBAR_ITEM(PREVTAB_BUTTON, prevtab, false, NULL)
+TOOLBAR_ITEM(CONTENTS_BUTTON, contents, true, NULL)
+TOOLBAR_ITEM(GUIDE_BUTTON, guide, true, NULL)
+TOOLBAR_ITEM(INFO_BUTTON, info, true, NULL)
+TOOLBAR_ITEM(ABOUT_BUTTON, about, true, NULL)
 
 #ifdef TOOLBAR_ITEM_SET
 #undef TOOLBAR_ITEM


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

Summary of changes:
 frontends/gtk/scaffolding.c   |    1 +
 frontends/gtk/toolbar.c       |  686 ++++++++++++++++++++++++++++-------------
 frontends/gtk/toolbar.h       |    3 +-
 frontends/gtk/toolbar_items.h |  104 +++----
 4 files changed, 518 insertions(+), 276 deletions(-)

diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 5c57011..b523645 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -54,6 +54,7 @@
 #include "gtk/compat.h"
 #include "gtk/warn.h"
 #include "gtk/cookies.h"
+#include "gtk/completion.h"
 #include "gtk/preferences.h"
 #include "gtk/about.h"
 #include "gtk/viewsource.h"
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index a17ffd3..c543eed 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -27,7 +27,9 @@
 #include <gtk/gtk.h>
 
 #include "netsurf/browser_window.h"
+#include "desktop/browser_history.h"
 #include "desktop/searchweb.h"
+#include "desktop/search.h"
 #include "utils/log.h"
 #include "utils/messages.h"
 #include "utils/nsoption.h"
@@ -46,6 +48,7 @@
 #include "gtk/toolbar_items.h"
 #include "gtk/toolbar.h"
 #include "gtk/schedule.h"
+#include "gtk/local_history.h"
 
 /**
  * button location indicating button is not to be shown
@@ -64,8 +67,13 @@ struct nsgtk_toolbar_item {
        GtkToolItem *button;
        int         location; /* in toolbar */
        bool        sensitivity;
+
+       /**
+        * button clicked handler
+        */
+       gboolean (*bhandler)(GtkWidget *widget, gpointer data);
+
        void        *mhandler; /* menu item clicked */
-       void        *bhandler; /* button clicked */
        void        *dataplus; /* customization -> toolbar */
        void        *dataminus; /* customization -> store */
 };
@@ -92,9 +100,6 @@ struct nsgtk_toolbar {
        /** entry widget holding the url of the current displayed page */
        GtkWidget *url_bar;
 
-       /** Completions for url_bar */
-       GtkEntryCompletion *url_bar_completion;
-
        /** Current frame of throbber animation */
        int throb_frame;
 
@@ -173,7 +178,7 @@ struct nsgtk_theme {
 
 
 /* define data plus and data minus handlers */
-#define TOOLBAR_ITEM(identifier, name, sensitivity)                    \
+#define TOOLBAR_ITEM(identifier, name, sensitivity, clicked)           \
 static gboolean                                                                
\
 nsgtk_toolbar_##name##_data_plus(GtkWidget *widget,                    \
                                 GdkDragContext *cont,                  \
@@ -537,6 +542,108 @@ static char *remove_underscores(const char *s, bool 
replacespace)
 
 
 /**
+ * create throbber toolbar item widget
+ *
+ * create a gtk entry widget with a completion attached
+ */
+static GtkToolItem *
+make_toolbar_item_throbber(void)
+{
+       nserror res;
+       GtkToolItem *item;
+       GdkPixbuf *pixbuf;
+       GtkWidget *image;
+
+       res = nsgtk_throbber_get_frame(0, &pixbuf);
+       if (res != NSERROR_OK) {
+               return NULL;
+       }
+
+       if (edit_mode) {
+               item = gtk_tool_button_new(
+                               GTK_WIDGET(gtk_image_new_from_pixbuf(pixbuf)),
+                               "[throbber]");
+       } else {
+               item = gtk_tool_item_new();
+
+               image = gtk_image_new_from_pixbuf(pixbuf);
+               if (image != NULL) {
+                       nsgtk_widget_set_alignment(image,
+                                                  GTK_ALIGN_CENTER,
+                                                  GTK_ALIGN_CENTER);
+                       nsgtk_widget_set_margins(image, 3, 0);
+
+                       gtk_container_add(GTK_CONTAINER(item), image);
+               }
+       }
+       return item;
+}
+
+/**
+ * create url bar toolbar item widget
+ *
+ * create a gtk entry widget with a completion attached
+ */
+static GtkToolItem *
+make_toolbar_item_url_bar(void)
+{
+       GtkToolItem *item;
+       GtkWidget *entry;
+       GtkEntryCompletion *completion;
+
+       item = gtk_tool_item_new();
+       entry = nsgtk_entry_new();
+       completion = gtk_entry_completion_new();
+
+       if ((entry == NULL) || (completion == NULL) || (item == NULL)) {
+               return NULL;
+       }
+
+       gtk_entry_set_completion(GTK_ENTRY(entry), completion);
+       gtk_container_add(GTK_CONTAINER(item), entry);
+       gtk_tool_item_set_expand(item, TRUE);
+
+       return item;
+}
+
+
+/**
+ * create web search toolbar item widget
+ */
+static GtkToolItem *
+make_toolbar_item_websearch(void)
+{
+       GtkToolItem *item;
+
+       if (edit_mode) {
+               item = gtk_tool_button_new(
+                               GTK_WIDGET(nsgtk_image_new_from_stock(
+                                               NSGTK_STOCK_FIND,
+                                               GTK_ICON_SIZE_LARGE_TOOLBAR)),
+                               "[websearch]");
+       } else {
+               GtkWidget *entry = nsgtk_entry_new();
+
+               item = gtk_tool_item_new();
+
+               if ((entry == NULL) || (item == NULL)) {
+                       return NULL;
+               }
+
+               gtk_widget_set_size_request(entry, NSGTK_WEBSEARCH_WIDTH, -1);
+
+               nsgtk_entry_set_icon_from_stock(entry,
+                                               GTK_ENTRY_ICON_PRIMARY,
+                                               NSGTK_STOCK_INFO);
+
+               gtk_container_add(GTK_CONTAINER(item), entry);
+       }
+
+       return item;
+}
+
+
+/**
  * widget factory for creation of toolbar item widgets
  *
  * \param i the id of the widget
@@ -580,92 +687,30 @@ make_toolbar_item(nsgtk_toolbar_button i, struct 
nsgtk_theme *theme)
                                theme->image[HISTORY_BUTTON]), "H"));
                break;
 
-       case URL_BAR_ITEM: {
-               /* create a gtk entry widget with a completion attached */
-               GtkWidget *entry;
-               GtkEntryCompletion *completion;
-
-               w = GTK_WIDGET(gtk_tool_item_new());
-               entry = nsgtk_entry_new();
-               completion = gtk_entry_completion_new();
-
-               if ((entry == NULL) || (completion == NULL) || (w == NULL)) {
-                       nsgtk_warning(messages_get("NoMemory"), 0);
-                       return NULL;
-               }
-
-               gtk_entry_set_completion(entry, completion);
-               gtk_container_add(GTK_CONTAINER(w), entry);
-               gtk_tool_item_set_expand(GTK_TOOL_ITEM(w), TRUE);
+       case URL_BAR_ITEM:
+               w = GTK_WIDGET(make_toolbar_item_url_bar());
                break;
-       }
-
-       case THROBBER_ITEM: {
-               nserror res;
-               GdkPixbuf *pixbuf;
-
-               res = nsgtk_throbber_get_frame(0, &pixbuf);
-               if (res != NSERROR_OK) {
-                       return NULL;
-               }
 
-               if (edit_mode) {
-                       w = GTK_WIDGET(gtk_tool_button_new(
-                               GTK_WIDGET(gtk_image_new_from_pixbuf(pixbuf)),
-                               "[throbber]"));
-               } else {
-                       GtkWidget *image;
-
-                       w = GTK_WIDGET(gtk_tool_item_new());
-
-                       image = gtk_image_new_from_pixbuf(pixbuf);
-                       if (image != NULL) {
-                               nsgtk_widget_set_alignment(image,
-                                                          GTK_ALIGN_CENTER,
-                                                          GTK_ALIGN_CENTER);
-                               nsgtk_widget_set_margins(image, 3, 0);
-
-                               gtk_container_add(GTK_CONTAINER(w), image);
-                       }
-               }
+       case THROBBER_ITEM:
+               w = GTK_WIDGET(make_toolbar_item_throbber());
                break;
-       }
-
-       case WEBSEARCH_ITEM: {
-               if (edit_mode)
-                       return GTK_WIDGET(gtk_tool_button_new(GTK_WIDGET(
-                                       
nsgtk_image_new_from_stock(NSGTK_STOCK_FIND,
-                                       GTK_ICON_SIZE_LARGE_TOOLBAR)),
-                                       "[websearch]"));
-
-               GtkWidget *entry = nsgtk_entry_new();
-
-               w = GTK_WIDGET(gtk_tool_item_new());
-
-               if ((entry == NULL) || (w == NULL)) {
-                       nsgtk_warning(messages_get("NoMemory"), 0);
-                       return NULL;
-               }
-
-               gtk_widget_set_size_request(entry, NSGTK_WEBSEARCH_WIDTH, -1);
 
-               nsgtk_entry_set_icon_from_stock(entry, GTK_ENTRY_ICON_PRIMARY,
-                                               NSGTK_STOCK_INFO);
-
-               gtk_container_add(GTK_CONTAINER(w), entry);
+       case WEBSEARCH_ITEM:
+               w = GTK_WIDGET(make_toolbar_item_websearch());
                break;
-       }
 
 /* gtk_tool_button_new accepts NULL args */
 #define MAKE_MENUBUTTON(p, q)                                          \
-               case p##_BUTTON: {                                      \
-                       char *label = NULL;                             \
-                       label = remove_underscores(messages_get(#q), false); \
-                       w = GTK_WIDGET(gtk_tool_button_new(GTK_WIDGET(  \
-                                          theme->image[p##_BUTTON]), label)); \
-                       if (label != NULL)                              \
-                               free(label);                            \
-                       break;                                          \
+       case p##_BUTTON: {                                              \
+               char *label = NULL;                                     \
+               label = remove_underscores(messages_get(#q), false);    \
+               w = GTK_WIDGET(gtk_tool_button_new(                     \
+                                       GTK_WIDGET(theme->image[p##_BUTTON]), \
+                                       label));                        \
+               if (label != NULL) {                                    \
+                       free(label);                                    \
+               }                                                       \
+               break;                                                  \
        }
 
        MAKE_MENUBUTTON(NEWWINDOW, gtkNewWindow)
@@ -716,6 +761,11 @@ make_toolbar_item(nsgtk_toolbar_button i, struct 
nsgtk_theme *theme)
                break;
 
        }
+
+       if (w == NULL) {
+               nsgtk_warning(messages_get("NoMemory"), 0);
+       }
+
        return w;
 }
 
@@ -1414,17 +1464,6 @@ int nsgtk_toolbar_get_id_from_widget(GtkWidget *widget,
        return -1;
 }
 
-/* exported interface documented in gtk/scaffolding.h */
-static void nsgtk_scaffolding_update_url_bar_ref(struct nsgtk_scaffolding *g)
-{
-       #if 0
-       g->url_bar = GTK_WIDGET(gtk_bin_get_child(GTK_BIN(
-                       g->buttons[URL_BAR_ITEM]->button)));
-
-       gtk_entry_set_completion(GTK_ENTRY(g->url_bar),
-                       g->url_bar_completion);
-       #endif
-}
 
 /**
  * add handlers to factory widgets
@@ -1436,7 +1475,6 @@ nsgtk_toolbar_set_handler(struct nsgtk_scaffolding *g, 
nsgtk_toolbar_button i)
 {
        switch(i) {
        case URL_BAR_ITEM:
-               nsgtk_scaffolding_update_url_bar_ref(g);
                g_signal_connect(GTK_WIDGET(nsgtk_scaffolding_urlbar(g)),
                                 "activate", G_CALLBACK(
                                         nsgtk_window_url_activate_event), g);
@@ -1633,125 +1671,6 @@ static nserror populate_gtk_toolbar_widget(struct 
nsgtk_toolbar *tb)
        return NSERROR_OK;
 }
 
-/**
- * create a toolbar item
- *
- * create a toolbar item and set up its default handlers
- */
-static nserror
-toolbar_item_create(nsgtk_toolbar_button id,
-                   struct nsgtk_toolbar_item **item_out)
-{
-       struct nsgtk_toolbar_item *item;
-       item = calloc(1, sizeof(struct nsgtk_toolbar_item));
-       if (item == NULL) {
-               return NSERROR_NOMEM;
-       }
-       item->location = INACTIVE_LOCATION;
-
-       switch (id) {
-#define TOOLBAR_ITEM(identifier, name, snstvty)                                
\
-       case identifier:                                                \
-               item->sensitivity = snstvty;                            \
-               item->dataplus = nsgtk_toolbar_##name##_data_plus;      \
-               item->dataminus = nsgtk_toolbar_##name##_data_minus;    \
-               break;
-#include "gtk/toolbar_items.h"
-#undef TOOLBAR_ITEM
-
-       case PLACEHOLDER_BUTTON:
-               free(item);
-               return NSERROR_INVALID;
-       }
-
-       *item_out = item;
-       return NSERROR_OK;
-}
-
-/**
- * set a toolbar items sensitivity
- *
- * note this does not set menu items sensitivity
- */
-static nserror
-set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
-{
-       if (item->sensitivity == sensitivity) {
-               /* item does not require sensitivity changing */
-               return NSERROR_OK;
-       }
-       item->sensitivity = sensitivity;
-
-       if ((item->location != -1) && (item->button != NULL)) {
-               gtk_widget_set_sensitive(GTK_WIDGET(item->button),
-                                        item->sensitivity);
-       }
-
-       return NSERROR_OK;
-
-}
-
-/**
- * set a toolbar item to a throbber frame number
- *
- * \param toolbar_item The toolbar item to update
- * \param frame The animation frame number to update to
- * \return NSERROR_OK on success,
- *         NSERROR_INVALID if the toolbar item does not contain an image,
- *         NSERROR_BAD_SIZE if the frame is out of range.
- */
-static nserror set_throbber_frame(GtkToolItem *toolbar_item, int frame)
-{
-       nserror res;
-       GdkPixbuf *pixbuf;
-       GtkImage *throbber;
-
-       if (toolbar_item == NULL) {
-               /* no toolbar item */
-               return NSERROR_INVALID;
-       }
-
-       res = nsgtk_throbber_get_frame(frame, &pixbuf);
-       if (res != NSERROR_OK) {
-               return res;
-       }
-
-       throbber = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(toolbar_item)));
-
-       gtk_image_set_from_pixbuf(throbber, pixbuf);
-
-       return NSERROR_OK;
-}
-
-
-/**
- * Make the throbber run.
- *
- * scheduled callback to update the throbber
- *
- * \param p The context passed when scheduled.
- */
-static void next_throbber_frame(void *p)
-{
-       struct nsgtk_toolbar *tb = p;
-       nserror res;
-
-       tb->throb_frame++; /* advance to next frame */
-
-       res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
-                                tb->throb_frame);
-       if (res == NSERROR_BAD_SIZE) {
-               tb->throb_frame = 1;
-               res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
-                                        tb->throb_frame);
-       }
-
-       /* only schedule next frame if there are no errors */
-       if (res == NSERROR_OK) {
-               nsgtk_schedule(THROBBER_FRAME_TIME, next_throbber_frame, p);
-       }
-}
-
 
 /**
  * find the toolbar item with a given location.
@@ -1794,6 +1713,28 @@ itemid_from_gtktoolitem(struct nsgtk_toolbar *tb, 
GtkToolItem *toolitem)
 
 
 /**
+ * set a toolbar items sensitivity
+ *
+ * note this does not set menu items sensitivity
+ */
+static nserror
+set_item_sensitivity(struct nsgtk_toolbar_item *item, bool sensitivity)
+{
+       if (item->sensitivity != sensitivity) {
+               /* item requires sensitivity changing */
+               item->sensitivity = sensitivity;
+
+               if ((item->location != -1) && (item->button != NULL)) {
+                       gtk_widget_set_sensitive(GTK_WIDGET(item->button),
+                                                item->sensitivity);
+               }
+       }
+
+       return NSERROR_OK;
+}
+
+
+/**
  * callback for all toolbar items widget size allocation
  *
  * handler connected to all toolbar items for the size-allocate signal
@@ -1876,6 +1817,7 @@ static gboolean url_entry_activate_cb(GtkWidget *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * callback for url entry widget changing
  *
@@ -1893,11 +1835,295 @@ url_entry_changed_cb(GtkWidget *widget, GdkEventKey 
*event, gpointer data)
 }
 
 
+/**
+ * handler for back tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+back_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
+
+       if ((bw != NULL) && browser_window_history_back_available(bw)) {
+               /* clear potential search effects */
+               browser_window_search_clear(bw);
+
+               browser_window_history_back(bw, false);
+
+               set_item_sensitivity(tb->buttons[BACK_BUTTON],
+                               browser_window_history_back_available(bw));
+               set_item_sensitivity(tb->buttons[FORWARD_BUTTON],
+                               browser_window_history_forward_available(bw));
+
+               nsgtk_local_history_hide();
+       }
+       return TRUE;
+}
+
+
+/**
+ * handler for local history tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+localhistory_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       nserror res;
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+       GtkWidget *toplevel;
+
+       toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+       if (toplevel != NULL) {
+               bw = tb->get_bw(tb->get_bw_ctx);
+
+               res = nsgtk_local_history_present(GTK_WINDOW(toplevel), bw);
+               if (res != NSERROR_OK) {
+                       NSLOG(netsurf, INFO,
+                             "Unable to present local history window.");
+               }
+       }
+       return TRUE;
+}
+
+
+/**
+ * handler for forward tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+forward_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
+
+       if ((bw != NULL) && browser_window_history_forward_available(bw)) {
+               /* clear potential search effects */
+               browser_window_search_clear(bw);
+
+               browser_window_history_forward(bw, false);
+
+               set_item_sensitivity(tb->buttons[BACK_BUTTON],
+                               browser_window_history_back_available(bw));
+               set_item_sensitivity(tb->buttons[FORWARD_BUTTON],
+                               browser_window_history_forward_available(bw));
+               nsgtk_local_history_hide();
+       }
+       return TRUE;
+}
+
+
+/**
+ * handler for stop tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+stop_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+
+       browser_window_stop(tb->get_bw(tb->get_bw_ctx));
+
+       return TRUE;
+}
+
+
+/**
+ * handler for reload tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+reload_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
+
+       /* clear potential search effects */
+       browser_window_search_clear(bw);
+
+       browser_window_reload(bw, true);
+
+       return TRUE;
+}
+
+
+/**
+ * handler for home tool bar item clicked signal
+ *
+ * \param widget The widget the signal is being delivered to.
+ * \param data The toolbar context passed when the signal was connected
+ * \return TRUE
+ */
+static gboolean
+home_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+       nserror res;
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       const char *addr;
+       struct browser_window *bw;
+       nsurl *url;
+
+       if (nsoption_charp(homepage_url) != NULL) {
+               addr = nsoption_charp(homepage_url);
+       } else {
+               addr = NETSURF_HOMEPAGE;
+       }
+
+       res = nsurl_create(addr, &url);
+       if (res == NSERROR_OK) {
+               bw = tb->get_bw(tb->get_bw_ctx);
+
+               res = browser_window_navigate(bw,
+                                             url,
+                                             NULL,
+                                             BW_NAVIGATE_HISTORY,
+                                             NULL,
+                                             NULL,
+                                             NULL);
+               nsurl_unref(url);
+       }
+       if (res != NSERROR_OK) {
+               nsgtk_warning(messages_get_errorcode(res), 0);
+       }
+
+       return TRUE;
+}
+
+
+/**
+ * create a toolbar item
+ *
+ * create a toolbar item and set up its default handlers
+ */
+static nserror
+toolbar_item_create(nsgtk_toolbar_button id,
+                   struct nsgtk_toolbar_item **item_out)
+{
+       struct nsgtk_toolbar_item *item;
+       item = calloc(1, sizeof(struct nsgtk_toolbar_item));
+       if (item == NULL) {
+               return NSERROR_NOMEM;
+       }
+       item->location = INACTIVE_LOCATION;
+
+       /* set item defaults from macro */
+       switch (id) {
+#define TOOLBAR_ITEM(identifier, name, snstvty, clicked)               \
+       case identifier:                                                \
+               item->sensitivity = snstvty;                            \
+               item->dataplus = nsgtk_toolbar_##name##_data_plus;      \
+               item->dataminus = nsgtk_toolbar_##name##_data_minus;    \
+               item->bhandler = clicked;                               \
+               break;
+#include "gtk/toolbar_items.h"
+#undef TOOLBAR_ITEM
+
+       case PLACEHOLDER_BUTTON:
+               free(item);
+               return NSERROR_INVALID;
+       }
+
+       *item_out = item;
+       return NSERROR_OK;
+}
+
+
+/**
+ * set a toolbar item to a throbber frame number
+ *
+ * \param toolbar_item The toolbar item to update
+ * \param frame The animation frame number to update to
+ * \return NSERROR_OK on success,
+ *         NSERROR_INVALID if the toolbar item does not contain an image,
+ *         NSERROR_BAD_SIZE if the frame is out of range.
+ */
+static nserror set_throbber_frame(GtkToolItem *toolbar_item, int frame)
+{
+       nserror res;
+       GdkPixbuf *pixbuf;
+       GtkImage *throbber;
+
+       if (toolbar_item == NULL) {
+               /* no toolbar item */
+               return NSERROR_INVALID;
+       }
+
+       res = nsgtk_throbber_get_frame(frame, &pixbuf);
+       if (res != NSERROR_OK) {
+               return res;
+       }
+
+       throbber = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(toolbar_item)));
+
+       gtk_image_set_from_pixbuf(throbber, pixbuf);
+
+       return NSERROR_OK;
+}
+
+
+/**
+ * Make the throbber run.
+ *
+ * scheduled callback to update the throbber
+ *
+ * \param p The context passed when scheduled.
+ */
+static void next_throbber_frame(void *p)
+{
+       struct nsgtk_toolbar *tb = p;
+       nserror res;
+
+       tb->throb_frame++; /* advance to next frame */
+
+       res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
+                                tb->throb_frame);
+       if (res == NSERROR_BAD_SIZE) {
+               tb->throb_frame = 1;
+               res = set_throbber_frame(tb->buttons[THROBBER_ITEM]->button,
+                                        tb->throb_frame);
+       }
+
+       /* only schedule next frame if there are no errors */
+       if (res == NSERROR_OK) {
+               nsgtk_schedule(THROBBER_FRAME_TIME, next_throbber_frame, p);
+       }
+}
+
+
+/**
+ * connect signal handlers to a gtk toolbar item
+ */
 static nserror
 toolbar_connect_signal(struct nsgtk_toolbar *tb, nsgtk_toolbar_button itemid)
 {
-       if (tb->buttons[itemid]->button != NULL) {
-               g_signal_connect(tb->buttons[itemid]->button,
+       struct nsgtk_toolbar_item *item;
+
+       item = tb->buttons[itemid];
+
+       if (item->button != NULL) {
+               g_signal_connect(item->button,
                                 "size-allocate",
                                 G_CALLBACK(toolbar_item_size_allocate_cb),
                                 tb);
@@ -1906,8 +2132,7 @@ toolbar_connect_signal(struct nsgtk_toolbar *tb, 
nsgtk_toolbar_button itemid)
        switch (itemid) {
        case URL_BAR_ITEM: {
                GtkEntry *url_entry;
-               url_entry = GTK_ENTRY(gtk_bin_get_child(
-                                       GTK_BIN(tb->buttons[itemid]->button)));
+               url_entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(item->button)));
                g_signal_connect(GTK_WIDGET(url_entry),
                                 "activate",
                                 G_CALLBACK(url_entry_activate_cb),
@@ -1922,6 +2147,16 @@ toolbar_connect_signal(struct nsgtk_toolbar *tb, 
nsgtk_toolbar_button itemid)
                                                tb->get_bw_ctx);
                break;
        }
+
+       default:
+               if ((item->bhandler != NULL) && (item->button != NULL)) {
+                       g_signal_connect(item->button,
+                                        "clicked",
+                                        G_CALLBACK(item->bhandler),
+                                        tb);
+               }
+               break;
+
        }
 
        return NSERROR_OK;
@@ -1965,8 +2200,11 @@ nsgtk_toolbar_create(GtkBuilder *builder,
 
        tb->get_bw = get_bw;
        tb->get_bw_ctx = get_bw_ctx;
+       /* set the throbber start frame. */
+       tb->throb_frame = 0;
 
        tb->widget = GTK_TOOLBAR(gtk_builder_get_object(builder, "toolbar"));
+       gtk_toolbar_set_show_arrow(tb->widget, TRUE);
 
        /* allocate button contexts */
        for (bidx = BACK_BUTTON; bidx < PLACEHOLDER_BUTTON; bidx++) {
@@ -1998,7 +2236,6 @@ nsgtk_toolbar_create(GtkBuilder *builder,
                return res;
        }
 
-       gtk_toolbar_set_show_arrow(tb->widget, TRUE);
        gtk_widget_show_all(GTK_WIDGET(tb->widget));
 
        /* if there is a history widget set its size */
@@ -2007,9 +2244,6 @@ nsgtk_toolbar_create(GtkBuilder *builder,
                        tb->buttons[HISTORY_BUTTON]->button), 20, -1);
        }
 
-       /* set the throbber start frame. */
-       tb->throb_frame = 0;
-
        res = toolbar_connect_signals(tb);
        if (res != NSERROR_OK) {
                free(tb);
@@ -2072,6 +2306,9 @@ nserror nsgtk_toolbar_update(struct nsgtk_toolbar *tb)
 nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, bool active)
 {
        nserror res;
+       struct browser_window *bw;
+
+       bw = tb->get_bw(tb->get_bw_ctx);
 
        /* when activating the throbber simply schedule the next frame update */
        if (active) {
@@ -2092,6 +2329,11 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, 
bool active)
        /* adjust sensitivity of other items */
        set_item_sensitivity(tb->buttons[STOP_BUTTON], false);
        set_item_sensitivity(tb->buttons[RELOAD_BUTTON], true);
+       set_item_sensitivity(tb->buttons[BACK_BUTTON],
+                            browser_window_history_back_available(bw));
+       set_item_sensitivity(tb->buttons[FORWARD_BUTTON],
+                            browser_window_history_forward_available(bw));
+       nsgtk_local_history_hide();
 
        return res;
 }
diff --git a/frontends/gtk/toolbar.h b/frontends/gtk/toolbar.h
index 9c410d1..f04d807 100644
--- a/frontends/gtk/toolbar.h
+++ b/frontends/gtk/toolbar.h
@@ -32,8 +32,7 @@ struct nsgtk_toolbar;
  * \param[out] toolbar a pointer to receive the result.
  * \return NSERROR_OK and toolbar updated on success else error code
  */
-nserror nsgtk_toolbar_create(GtkBuilder *builder, struct browser_window 
*(*get_bw)(void *ctx),
-                    void *get_bw_ctx,struct nsgtk_toolbar **toolbar);
+nserror nsgtk_toolbar_create(GtkBuilder *builder, struct browser_window 
*(*get_bw)(void *ctx), void *get_bw_ctx,struct nsgtk_toolbar **toolbar);
 
 
 /**
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index 0e1eae4..5281ab6 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -84,61 +84,61 @@ typedef enum {
  */
 
 #ifndef TOOLBAR_ITEM
-#define TOOLBAR_ITEM(a, b, c)
+#define TOOLBAR_ITEM(a, b, c, d)
 #define TOOLBAR_ITEM_SET
 #endif
 
-TOOLBAR_ITEM(BACK_BUTTON, back, false)
-TOOLBAR_ITEM(HISTORY_BUTTON, history, true)
-TOOLBAR_ITEM(FORWARD_BUTTON, forward, false)
-TOOLBAR_ITEM(STOP_BUTTON, stop, false)
-TOOLBAR_ITEM(RELOAD_BUTTON, reload, true)
-TOOLBAR_ITEM(HOME_BUTTON, home, true)
-TOOLBAR_ITEM(URL_BAR_ITEM, url_bar, true)
-TOOLBAR_ITEM(WEBSEARCH_ITEM, websearch, true)
-TOOLBAR_ITEM(THROBBER_ITEM, throbber, true)
-TOOLBAR_ITEM(NEWWINDOW_BUTTON, newwindow, true)
-TOOLBAR_ITEM(NEWTAB_BUTTON, newtab, true)
-TOOLBAR_ITEM(OPENFILE_BUTTON, openfile, true)
-TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false)
-TOOLBAR_ITEM(CLOSEWINDOW_BUTTON, closewindow, true)
-TOOLBAR_ITEM(SAVEPAGE_BUTTON, savepage, true)
-TOOLBAR_ITEM(PDF_BUTTON, pdf, false)
-TOOLBAR_ITEM(PLAINTEXT_BUTTON, plaintext, true)
-TOOLBAR_ITEM(DRAWFILE_BUTTON, drawfile, false)
-TOOLBAR_ITEM(POSTSCRIPT_BUTTON, postscript, false)
-TOOLBAR_ITEM(PRINTPREVIEW_BUTTON, printpreview, false)
-TOOLBAR_ITEM(PRINT_BUTTON, print, true)
-TOOLBAR_ITEM(QUIT_BUTTON, quit, true)
-TOOLBAR_ITEM(CUT_BUTTON, cut, true)
-TOOLBAR_ITEM(COPY_BUTTON, copy, true)
-TOOLBAR_ITEM(PASTE_BUTTON, paste, true)
-TOOLBAR_ITEM(DELETE_BUTTON, delete, false)
-TOOLBAR_ITEM(SELECTALL_BUTTON, selectall, true)
-TOOLBAR_ITEM(FIND_BUTTON, find, true)
-TOOLBAR_ITEM(PREFERENCES_BUTTON, preferences, true)
-TOOLBAR_ITEM(ZOOMPLUS_BUTTON, zoomplus, true)
-TOOLBAR_ITEM(ZOOMMINUS_BUTTON, zoomminus, true)
-TOOLBAR_ITEM(ZOOMNORMAL_BUTTON, zoomnormal, true)
-TOOLBAR_ITEM(FULLSCREEN_BUTTON, fullscreen, true)
-TOOLBAR_ITEM(VIEWSOURCE_BUTTON, viewsource, true)
-TOOLBAR_ITEM(DOWNLOADS_BUTTON, downloads, true)
-TOOLBAR_ITEM(SAVEWINDOWSIZE_BUTTON, savewindowsize, true)
-TOOLBAR_ITEM(TOGGLEDEBUGGING_BUTTON, toggledebugging, true)
-TOOLBAR_ITEM(SAVEBOXTREE_BUTTON, debugboxtree, true)
-TOOLBAR_ITEM(SAVEDOMTREE_BUTTON, debugdomtree, true)
-TOOLBAR_ITEM(LOCALHISTORY_BUTTON, localhistory, true)
-TOOLBAR_ITEM(GLOBALHISTORY_BUTTON, globalhistory, true)
-TOOLBAR_ITEM(ADDBOOKMARKS_BUTTON, addbookmarks, true)
-TOOLBAR_ITEM(SHOWBOOKMARKS_BUTTON, showbookmarks, true)
-TOOLBAR_ITEM(SHOWCOOKIES_BUTTON, showcookies, true)
-TOOLBAR_ITEM(OPENLOCATION_BUTTON, openlocation, true)
-TOOLBAR_ITEM(NEXTTAB_BUTTON, nexttab, false)
-TOOLBAR_ITEM(PREVTAB_BUTTON, prevtab, false)
-TOOLBAR_ITEM(CONTENTS_BUTTON, contents, true)
-TOOLBAR_ITEM(GUIDE_BUTTON, guide, true)
-TOOLBAR_ITEM(INFO_BUTTON, info, true)
-TOOLBAR_ITEM(ABOUT_BUTTON, about, true)
+TOOLBAR_ITEM(BACK_BUTTON, back, false, back_button_clicked_cb)
+TOOLBAR_ITEM(HISTORY_BUTTON, history, true, localhistory_button_clicked_cb)
+TOOLBAR_ITEM(FORWARD_BUTTON, forward, false, forward_button_clicked_cb)
+TOOLBAR_ITEM(STOP_BUTTON, stop, false, stop_button_clicked_cb)
+TOOLBAR_ITEM(RELOAD_BUTTON, reload, true, reload_button_clicked_cb)
+TOOLBAR_ITEM(HOME_BUTTON, home, true, home_button_clicked_cb)
+TOOLBAR_ITEM(URL_BAR_ITEM, url_bar, true, NULL)
+TOOLBAR_ITEM(WEBSEARCH_ITEM, websearch, true, NULL)
+TOOLBAR_ITEM(THROBBER_ITEM, throbber, true, NULL)
+TOOLBAR_ITEM(NEWWINDOW_BUTTON, newwindow, true, NULL)
+TOOLBAR_ITEM(NEWTAB_BUTTON, newtab, true, NULL)
+TOOLBAR_ITEM(OPENFILE_BUTTON, openfile, true, NULL)
+TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false, NULL)
+TOOLBAR_ITEM(CLOSEWINDOW_BUTTON, closewindow, true, NULL)
+TOOLBAR_ITEM(SAVEPAGE_BUTTON, savepage, true, NULL)
+TOOLBAR_ITEM(PDF_BUTTON, pdf, false, NULL)
+TOOLBAR_ITEM(PLAINTEXT_BUTTON, plaintext, true, NULL)
+TOOLBAR_ITEM(DRAWFILE_BUTTON, drawfile, false, NULL)
+TOOLBAR_ITEM(POSTSCRIPT_BUTTON, postscript, false, NULL)
+TOOLBAR_ITEM(PRINTPREVIEW_BUTTON, printpreview, false, NULL)
+TOOLBAR_ITEM(PRINT_BUTTON, print, true, NULL)
+TOOLBAR_ITEM(QUIT_BUTTON, quit, true, NULL)
+TOOLBAR_ITEM(CUT_BUTTON, cut, true, NULL)
+TOOLBAR_ITEM(COPY_BUTTON, copy, true, NULL)
+TOOLBAR_ITEM(PASTE_BUTTON, paste, true, NULL)
+TOOLBAR_ITEM(DELETE_BUTTON, delete, false, NULL)
+TOOLBAR_ITEM(SELECTALL_BUTTON, selectall, true, NULL)
+TOOLBAR_ITEM(FIND_BUTTON, find, true, NULL)
+TOOLBAR_ITEM(PREFERENCES_BUTTON, preferences, true, NULL)
+TOOLBAR_ITEM(ZOOMPLUS_BUTTON, zoomplus, true, NULL)
+TOOLBAR_ITEM(ZOOMMINUS_BUTTON, zoomminus, true, NULL)
+TOOLBAR_ITEM(ZOOMNORMAL_BUTTON, zoomnormal, true, NULL)
+TOOLBAR_ITEM(FULLSCREEN_BUTTON, fullscreen, true, NULL)
+TOOLBAR_ITEM(VIEWSOURCE_BUTTON, viewsource, true, NULL)
+TOOLBAR_ITEM(DOWNLOADS_BUTTON, downloads, true, NULL)
+TOOLBAR_ITEM(SAVEWINDOWSIZE_BUTTON, savewindowsize, true, NULL)
+TOOLBAR_ITEM(TOGGLEDEBUGGING_BUTTON, toggledebugging, true, NULL)
+TOOLBAR_ITEM(SAVEBOXTREE_BUTTON, debugboxtree, true, NULL)
+TOOLBAR_ITEM(SAVEDOMTREE_BUTTON, debugdomtree, true, NULL)
+TOOLBAR_ITEM(LOCALHISTORY_BUTTON, localhistory, true, 
localhistory_button_clicked_cb)
+TOOLBAR_ITEM(GLOBALHISTORY_BUTTON, globalhistory, true, NULL)
+TOOLBAR_ITEM(ADDBOOKMARKS_BUTTON, addbookmarks, true, NULL)
+TOOLBAR_ITEM(SHOWBOOKMARKS_BUTTON, showbookmarks, true, NULL)
+TOOLBAR_ITEM(SHOWCOOKIES_BUTTON, showcookies, true, NULL)
+TOOLBAR_ITEM(OPENLOCATION_BUTTON, openlocation, true, NULL)
+TOOLBAR_ITEM(NEXTTAB_BUTTON, nexttab, false, NULL)
+TOOLBAR_ITEM(PREVTAB_BUTTON, prevtab, false, NULL)
+TOOLBAR_ITEM(CONTENTS_BUTTON, contents, true, NULL)
+TOOLBAR_ITEM(GUIDE_BUTTON, guide, true, NULL)
+TOOLBAR_ITEM(INFO_BUTTON, info, true, NULL)
+TOOLBAR_ITEM(ABOUT_BUTTON, about, true, NULL)
 
 #ifdef TOOLBAR_ITEM_SET
 #undef TOOLBAR_ITEM


-- 
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