Gitweb links:

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

The branch, vince/gtk-tab-restyle has been updated
       via  d43df4b133335c62c6bc4d7c6d6a041ca1d7f62f (commit)
      from  ac7a9aefce8d622df78e980937771bd5bcc7cee0 (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=d43df4b133335c62c6bc4d7c6d6a041ca1d7f62f
commit d43df4b133335c62c6bc4d7c6d6a041ca1d7f62f
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    make popup context menu work on toolbar

diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index d7e7d59..a7414eb 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -79,29 +79,6 @@
 #include "gtk/resources.h"
 #include "gtk/layout_pango.h"
 
-/** Macro to define a handler for menu, button and activate events. */
-#define MULTIHANDLER(q)\
-static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g);\
-static gboolean nsgtk_on_##q##_activate_menu(GtkMenuItem *widget, gpointer 
data)\
-{\
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;\
-       return nsgtk_on_##q##_activate(g);\
-}\
-static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g)
-
-
-/**
- * handle menu activate signals by calling toolbar item activation
- */
-#define MENUHANDLER(name, itemid)                                      \
-static gboolean                                                                
\
-nsgtk_on_##name##_activate_menu(GtkMenuItem *widget, gpointer data)    \
-{                                                                      \
-       struct nsgtk_scaffolding *gs = (struct nsgtk_scaffolding *)data;\
-       nsgtk_window_item_activate(gs->top_level, itemid);              \
-       return TRUE;                                                    \
-}
-
 
 /**
  * menu entry context
@@ -464,33 +441,16 @@ nsgtk_window_url_changed(GtkWidget *widget,
        return nsgtk_completion_update(GTK_ENTRY(widget));
 }
 
-
-/**
- * Event handler for popup menu on toolbar.
- *
- * \param toolbar The toolbar being clicked
- * \param x The x coordinate where the click happened
- * \param y The x coordinate where the click happened
- * \param button the buttons being pressed
- * \param data The context pointer passed when the connection was made.
- * \return TRUE to indicate event handled.
- */
-static gboolean
-nsgtk_window_tool_bar_clicked(GtkToolbar *toolbar,
-                             gint x,
-                             gint y,
-                             gint button,
-                             gpointer data)
+/* exported interface documented in gtk/scaffolding.h */
+nserror nsgtk_scaffolding_toolbar_context_menu(struct nsgtk_scaffolding *gs)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-
        /* set visibility for right-click popup menu */
-       popup_menu_hide(g->menu_popup, true, false, true, false);
-       popup_menu_show(g->menu_popup, false, false, false, true);
+       popup_menu_hide(gs->menu_popup, true, false, true, false);
+       popup_menu_show(gs->menu_popup, false, false, false, true);
 
-       nsgtk_menu_popup_at_pointer(g->menu_popup->popup_menu, NULL);
+       nsgtk_menu_popup_at_pointer(gs->menu_popup->popup_menu, NULL);
 
-       return TRUE;
+       return NSERROR_OK;
 }
 
 
@@ -574,6 +534,18 @@ nsgtk_window_tabs_remove(GtkNotebook *notebook,
 /* signal handlers for menu entries */
 
 /**
+ * handle menu activate signals by calling toolbar item activation
+ */
+#define MENUHANDLER(name, itemid)                                      \
+static gboolean                                                                
\
+nsgtk_on_##name##_activate_menu(GtkMenuItem *widget, gpointer data)    \
+{                                                                      \
+       struct nsgtk_scaffolding *gs = (struct nsgtk_scaffolding *)data;\
+       nsgtk_window_item_activate(gs->top_level, itemid);              \
+       return TRUE;                                                    \
+}
+
+/**
  * menu signal handler for activation on new window item
  */
 MENUHANDLER(newwindow, NEWWINDOW_BUTTON);
@@ -623,6 +595,165 @@ MENUHANDLER(closewindow, CLOSEWINDOW_BUTTON);
  */
 MENUHANDLER(quit, QUIT_BUTTON);
 
+/**
+ * menu signal handler for activation on cut item
+ */
+MENUHANDLER(cut, CUT_BUTTON);
+
+/**
+ * menu signal handler for activation on copy item
+ */
+MENUHANDLER(copy, COPY_BUTTON);
+
+/**
+ * menu signal handler for activation on paste item
+ */
+MENUHANDLER(paste, PASTE_BUTTON);
+
+/**
+ * menu signal handler for activation on delete item
+ */
+MENUHANDLER(delete, DELETE_BUTTON);
+
+
+
+/**
+ * menu signal handler for activation on selectall item
+ */
+MENUHANDLER(selectall, SELECTALL_BUTTON);
+
+/**
+ * menu signal handler for activation on preferences item
+ */
+MENUHANDLER(preferences, PREFERENCES_BUTTON);
+
+/**
+ * menu signal handler for activation on zoom plus item
+ */
+MENUHANDLER(zoomplus, ZOOMPLUS_BUTTON);
+
+/**
+ * menu signal handler for activation on zoom minus item
+ */
+MENUHANDLER(zoomminus, ZOOMMINUS_BUTTON);
+
+/**
+ * menu signal handler for activation on zoom normal item
+ */
+MENUHANDLER(zoomnormal, ZOOMNORMAL_BUTTON);
+
+/**
+ * menu signal handler for activation on full screen item
+ */
+MENUHANDLER(fullscreen, FULLSCREEN_BUTTON);
+
+/**
+ * menu signal handler for activation on view source item
+ */
+MENUHANDLER(viewsource, VIEWSOURCE_BUTTON);
+
+/**
+ * menu signal handler for activation on downloads item
+ */
+MENUHANDLER(downloads, DOWNLOADS_BUTTON);
+
+/**
+ * menu signal handler for activation on save window size item
+ */
+MENUHANDLER(savewindowsize, SAVEWINDOWSIZE_BUTTON);
+
+/**
+ * menu signal handler for activation on toggle debug render item
+ */
+MENUHANDLER(toggledebugging, TOGGLEDEBUGGING_BUTTON);
+
+/**
+ * menu signal handler for activation on debug box tree item
+ */
+MENUHANDLER(debugboxtree, SAVEBOXTREE_BUTTON);
+
+/**
+ * menu signal handler for activation on debug dom tree item
+ */
+MENUHANDLER(debugdomtree, SAVEDOMTREE_BUTTON);
+
+/**
+ * menu signal handler for activation on stop item
+ */
+MENUHANDLER(stop, STOP_BUTTON);
+
+/**
+ * menu signal handler for activation on reload item
+ */
+MENUHANDLER(reload, RELOAD_BUTTON);
+
+/**
+ * menu signal handler for activation on back item
+ */
+MENUHANDLER(back, BACK_BUTTON);
+
+/**
+ * menu signal handler for activation on forward item
+ */
+MENUHANDLER(forward, FORWARD_BUTTON);
+
+/**
+ * menu signal handler for activation on home item
+ */
+MENUHANDLER(home, HOME_BUTTON);
+
+/**
+ * menu signal handler for activation on localhistory item
+ */
+MENUHANDLER(localhistory, LOCALHISTORY_BUTTON);
+
+/**
+ * menu signal handler for activation on globalhistory item
+ */
+MENUHANDLER(globalhistory, GLOBALHISTORY_BUTTON);
+
+/**
+ * menu signal handler for activation on addbookmarks item
+ */
+MENUHANDLER(addbookmarks, ADDBOOKMARKS_BUTTON);
+
+/**
+ * menu signal handler for activation on showbookmarks item
+ */
+MENUHANDLER(showbookmarks, SHOWBOOKMARKS_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(showcookies, SHOWCOOKIES_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(openlocation, OPENLOCATION_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(contents, CONTENTS_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(guide, GUIDE_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(info, INFO_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(about, ABOUT_BUTTON);
+
+#undef MENUHANDLER
+
 
 static gboolean
 nsgtk_on_savelink_activate_menu(GtkMenuItem *widget, gpointer data)
@@ -649,6 +780,7 @@ nsgtk_on_savelink_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for opening new window from a link. attached to the popup menu.
  */
@@ -672,6 +804,7 @@ nsgtk_on_link_openwin_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for opening new tab from a link. attached to the popup menu.
  */
@@ -701,6 +834,7 @@ nsgtk_on_link_opentab_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for bookmarking a link. attached to the popup menu.
  */
@@ -715,6 +849,7 @@ nsgtk_on_link_bookmark_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for copying a link. attached to the popup menu.
  */
@@ -734,27 +869,6 @@ nsgtk_on_link_copy_activate_menu(GtkMenuItem *widget, 
gpointer data)
 }
 
 
-/**
- * menu signal handler for activation on cut item
- */
-MENUHANDLER(cut, CUT_BUTTON);
-
-/**
- * menu signal handler for activation on copy item
- */
-MENUHANDLER(copy, COPY_BUTTON);
-
-/**
- * menu signal handler for activation on paste item
- */
-MENUHANDLER(paste, PASTE_BUTTON);
-
-/**
- * menu signal handler for activation on delete item
- */
-MENUHANDLER(delete, DELETE_BUTTON);
-
-
 static gboolean
 nsgtk_on_customize_activate_menu(GtkMenuItem *widget, gpointer data)
 {
@@ -763,48 +877,15 @@ nsgtk_on_customize_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
-/**
- * menu signal handler for activation on selectall item
- */
-MENUHANDLER(selectall, SELECTALL_BUTTON);
 
-
-MULTIHANDLER(find)
+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);
        return TRUE;
 }
 
-/**
- * menu signal handler for activation on preferences item
- */
-MENUHANDLER(preferences, PREFERENCES_BUTTON);
-
-/**
- * menu signal handler for activation on zoom plus item
- */
-MENUHANDLER(zoomplus, ZOOMPLUS_BUTTON);
-
-/**
- * menu signal handler for activation on zoom minus item
- */
-MENUHANDLER(zoomminus, ZOOMMINUS_BUTTON);
-
-/**
- * menu signal handler for activation on zoom normal item
- */
-MENUHANDLER(zoomnormal, ZOOMNORMAL_BUTTON);
-
-/**
- * menu signal handler for activation on full screen item
- */
-MENUHANDLER(fullscreen, FULLSCREEN_BUTTON);
-
-/**
- * menu signal handler for activation on view source item
- */
-MENUHANDLER(viewsource, VIEWSOURCE_BUTTON);
-
 
 static gboolean
 nsgtk_on_menubar_activate_menu(GtkMenuItem *widget, gpointer data)
@@ -888,102 +969,29 @@ nsgtk_on_toolbar_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
-/**
- * menu signal handler for activation on downloads item
- */
-MENUHANDLER(downloads, DOWNLOADS_BUTTON);
-
-/**
- * menu signal handler for activation on save window size item
- */
-MENUHANDLER(savewindowsize, SAVEWINDOWSIZE_BUTTON);
-
-/**
- * menu signal handler for activation on toggle debug render item
- */
-MENUHANDLER(toggledebugging, TOGGLEDEBUGGING_BUTTON);
-
-/**
- * menu signal handler for activation on debug box tree item
- */
-MENUHANDLER(debugboxtree, SAVEBOXTREE_BUTTON);
-
-/**
- * menu signal handler for activation on debug dom tree item
- */
-MENUHANDLER(debugdomtree, SAVEDOMTREE_BUTTON);
-
-/**
- * menu signal handler for activation on stop item
- */
-MENUHANDLER(stop, STOP_BUTTON);
-
-/**
- * menu signal handler for activation on reload item
- */
-MENUHANDLER(reload, RELOAD_BUTTON);
-
-/**
- * menu signal handler for activation on back item
- */
-MENUHANDLER(back, BACK_BUTTON);
-
-/**
- * menu signal handler for activation on forward item
- */
-MENUHANDLER(forward, FORWARD_BUTTON);
 
-/**
- * menu signal handler for activation on home item
- */
-MENUHANDLER(home, HOME_BUTTON);
-
-/**
- * menu signal handler for activation on localhistory item
- */
-MENUHANDLER(localhistory, LOCALHISTORY_BUTTON);
-
-/**
- * menu signal handler for activation on globalhistory item
- */
-MENUHANDLER(globalhistory, GLOBALHISTORY_BUTTON);
-
-/**
- * menu signal handler for activation on addbookmarks item
- */
-MENUHANDLER(addbookmarks, ADDBOOKMARKS_BUTTON);
-
-/**
- * menu signal handler for activation on showbookmarks item
- */
-MENUHANDLER(showbookmarks, SHOWBOOKMARKS_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(showcookies, SHOWCOOKIES_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(openlocation, OPENLOCATION_BUTTON);
-
-
-MULTIHANDLER(nexttab)
+static gboolean
+nsgtk_on_nexttab_activate_menu(GtkMenuItem *widget, gpointer data)
 {
+       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+
        nsgtk_tab_next(g->notebook);
 
        return TRUE;
 }
 
-MULTIHANDLER(prevtab)
+
+static gboolean
+nsgtk_on_prevtab_activate_menu(GtkMenuItem *widget, gpointer data)
 {
+       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
 
        nsgtk_tab_prev(g->notebook);
 
        return TRUE;
 }
 
+
 /**
  * menu signal handler for activation on close tab item
  */
@@ -991,33 +999,13 @@ static gboolean
 nsgtk_on_closetab_activate_menu(GtkMenuItem *widget, gpointer data)
 {
        struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       nsgtk_window_item_activate(g->top_level, CLOSETAB_BUTTON);
-       return TRUE;
-}
 
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(contents, CONTENTS_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(guide, GUIDE_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(info, INFO_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(about, ABOUT_BUTTON);
+       nsgtk_tab_close_current(g->notebook);
 
+       return TRUE;
+}
 
-#undef MULTIHANDLER
-#undef MENUHANDLER
+/* end of menu callback handlers */
 
 /**
  * attach gtk signal handlers for menus
@@ -1322,7 +1310,9 @@ static nserror nsgtk_search_update(struct gtk_search 
*search)
        return NSERROR_OK;
 }
 
-
+/**
+ * create text search context
+ */
 static nserror
 nsgtk_search_create(GtkBuilder *builder, struct gtk_search **search_out)
 {
@@ -1350,6 +1340,50 @@ nsgtk_search_create(GtkBuilder *builder, struct 
gtk_search **search_out)
        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;
 }
 
@@ -1471,6 +1505,7 @@ nsgtk_scaffolding_set_websearch(struct nsgtk_scaffolding 
*g, const char *content
 #endif
 }
 
+
 /**
  * GTK UI callback when search provider details are updated.
  *
@@ -1789,8 +1824,10 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct 
gui_window *toplevel)
 
        gtk_builder_connect_signals(gs->builder, NULL);
 
-       gs->window = GTK_WINDOW(gtk_builder_get_object(gs->builder, 
"wndBrowser"));
-       gs->notebook = GTK_NOTEBOOK(gtk_builder_get_object(gs->builder, 
"notebook"));
+       gs->window = GTK_WINDOW(gtk_builder_get_object(gs->builder,
+                                                      "wndBrowser"));
+       gs->notebook = GTK_NOTEBOOK(gtk_builder_get_object(gs->builder,
+                                                          "notebook"));
 
 
        res = nsgtk_search_create(gs->builder, &gs->search);
@@ -1825,50 +1862,38 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct 
gui_window *toplevel)
 
        nsgtk_tab_init(gs);
 
-       g_signal_connect_after(gs->notebook, "page-added",
-                       G_CALLBACK(nsgtk_window_tabs_add), gs);
-       g_signal_connect_after(gs->notebook, "page-removed",
-                       G_CALLBACK(nsgtk_window_tabs_remove), gs);
-
-#define CONNECT(obj, sig, callback, ptr) \
-       g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
+       g_signal_connect_after(gs->notebook,
+                              "page-added",
+                              G_CALLBACK(nsgtk_window_tabs_add),
+                              gs);
+       g_signal_connect_after(gs->notebook,
+                              "page-removed",
+                              G_CALLBACK(nsgtk_window_tabs_remove),
+                              gs);
 
        /* connect main window signals to their handlers. */
-       CONNECT(gs->window,
-               "delete-event",
-               scaffolding_window_delete_event,
-               gs);
+       g_signal_connect(gs->window,
+                        "delete-event",
+                        G_CALLBACK(scaffolding_window_delete_event),
+                        gs);
 
-       CONNECT(gs->window, "destroy", scaffolding_window_destroy, gs);
+       g_signal_connect(gs->window,
+                        "destroy",
+                        G_CALLBACK(scaffolding_window_destroy),
+                        gs);
 
        /* toolbar URL bar menu bar search bar signal handlers */
-       CONNECT(gs->menu_bar->edit_submenu->edit, "show",
-               nsgtk_window_edit_menu_shown, gs);
-       CONNECT(gs->menu_bar->edit_submenu->edit, "hide",
-               nsgtk_window_edit_menu_hidden, gs);
-
-       CONNECT(gs->search->buttons[1], "clicked",
-                       nsgtk_search_forward_button_clicked, gs);
+       g_signal_connect(gs->menu_bar->edit_submenu->edit,
+                        "show",
+                        G_CALLBACK(nsgtk_window_edit_menu_shown),
+                        gs);
 
-       CONNECT(gs->search->buttons[0], "clicked",
-                       nsgtk_search_back_button_clicked, gs);
-
-       CONNECT(gs->search->entry, "changed", nsgtk_search_entry_changed, gs);
-
-       CONNECT(gs->search->entry, "activate", nsgtk_search_entry_activate, gs);
-
-       CONNECT(gs->search->entry, "key-press-event",
-               nsgtk_search_entry_key, gs);
-
-       CONNECT(gs->search->buttons[2], "clicked",
-               nsgtk_search_close_button_clicked, gs);
-
-       CONNECT(gs->search->caseSens, "toggled",
-               nsgtk_search_entry_changed, gs);
+       g_signal_connect(gs->menu_bar->edit_submenu->edit,
+                        "hide",
+                        G_CALLBACK(nsgtk_window_edit_menu_hidden),
+                        gs);
 
-       /** \todo fix popup menu */
-       //CONNECT(gs->tool_bar, "popup-context-menu",
-       //      nsgtk_window_tool_bar_clicked, gs);
+       nsgtk_search_connect_signals(gs);
 
        /* create popup menu */
        gs->menu_popup = nsgtk_new_scaffolding_popup(gs, group);
diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h
index 666bc50..a8cea20 100644
--- a/frontends/gtk/scaffolding.h
+++ b/frontends/gtk/scaffolding.h
@@ -69,6 +69,11 @@ nserror nsgtk_scaffolding_destroy_all(void);
 nserror nsgtk_scaffolding_throbber(struct gui_window* gw, bool active);
 
 /**
+ * open a toolbar context menu
+ */
+nserror nsgtk_scaffolding_toolbar_context_menu(struct nsgtk_scaffolding *gs);
+
+/**
  * Obtain the most recently used scaffolding element.
  *
  * This allows tabs to be opened in the most recently used window
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index fafa194..694c271 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -66,6 +66,7 @@
 #include "gtk/preferences.h"
 #include "gtk/hotlist.h"
 #include "gtk/cookies.h"
+#include "gtk/about.h"
 #include "gtk/toolbar.h"
 
 /**
@@ -131,7 +132,7 @@ struct nsgtk_toolbar {
        /**
         * context passed to get_bw function
         */
-       void *get_bw_ctx;
+       void *get_ctx;
 };
 
 
@@ -1722,7 +1723,7 @@ toolbar_navigate_to_url(struct nsgtk_toolbar *tb, const 
char *urltxt)
                return res;
        }
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        res = browser_window_navigate(bw,
                                      url,
@@ -1872,7 +1873,7 @@ 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);
+       bw = tb->get_bw(tb->get_ctx);
 
        if ((bw != NULL) && browser_window_history_back_available(bw)) {
                /* clear potential search effects */
@@ -1904,7 +1905,7 @@ 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);
+       bw = tb->get_bw(tb->get_ctx);
 
        if ((bw != NULL) && browser_window_history_forward_available(bw)) {
                /* clear potential search effects */
@@ -1934,7 +1935,7 @@ 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));
+       browser_window_stop(tb->get_bw(tb->get_ctx));
 
        return TRUE;
 }
@@ -1953,7 +1954,7 @@ 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);
+       bw = tb->get_bw(tb->get_ctx);
 
        /* clear potential search effects */
        browser_window_search_clear(bw);
@@ -2013,7 +2014,7 @@ static gboolean url_entry_activate_cb(GtkWidget *widget, 
gpointer data)
                              SEARCH_WEB_OMNI_NONE,
                              &url);
        if (res == NSERROR_OK) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                res = browser_window_navigate(
                        bw, url, NULL, BW_NAVIGATE_HISTORY, NULL, NULL, NULL);
                nsurl_unref(url);
@@ -2067,7 +2068,7 @@ static gboolean websearch_entry_activate_cb(GtkWidget 
*widget, gpointer data)
                              &url);
        if (res == NSERROR_OK) {
                temp_open_background = 0;
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
 
                res = browser_window_create(
                        BW_CREATE_HISTORY | BW_CREATE_TAB,
@@ -2133,7 +2134,7 @@ newwindow_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 
        res = nsurl_create(addr, &url);
        if (res == NSERROR_OK) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                res = browser_window_create(BW_CREATE_HISTORY,
                                              url,
                                              NULL,
@@ -2175,7 +2176,7 @@ newtab_button_clicked_cb(GtkWidget *widget, gpointer data)
        }
 
        if (res == NSERROR_OK) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
 
                res = browser_window_create(BW_CREATE_HISTORY |
                                            BW_CREATE_TAB,
@@ -2234,7 +2235,7 @@ openfile_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 
                        res = nsurl_create(urltxt, &url);
                        if (res == NSERROR_OK) {
-                               bw = tb->get_bw(tb->get_bw_ctx);
+                               bw = tb->get_bw(tb->get_ctx);
                                res = browser_window_navigate(bw,
                                                        url,
                                                        NULL,
@@ -2261,24 +2262,6 @@ openfile_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 
 
 /**
- * handler for close tab 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
-closetab_button_clicked_cb(GtkWidget *widget, gpointer data)
-{
-       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
-
-       nsgtk_tab_close_current(GTK_NOTEBOOK(tb->widget));
-
-       return TRUE;
-}
-
-
-/**
  * handler for close window tool bar item clicked signal
  *
  * \param widget The widget the signal is being delivered to.
@@ -2312,7 +2295,7 @@ savepage_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        nserror res;
        GtkWidget *toplevel;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
        res = nsgtk_saveas_dialog(bw,
@@ -2363,7 +2346,7 @@ pdf_button_clicked_cb(GtkWidget *widget, gpointer data)
        gchar *filename;
        nserror res;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2415,7 +2398,7 @@ plaintext_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        gchar *filename;
        nserror res;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2456,7 +2439,7 @@ print_button_clicked_cb(GtkWidget *widget, gpointer data)
        char *settings_fname = NULL;
        GtkWidget *toplevel;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2574,7 +2557,7 @@ cut_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_cut_clipboard(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_CUT_SELECTION);
        }
 
@@ -2605,7 +2588,7 @@ copy_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_copy_clipboard(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_COPY_SELECTION);
        }
 
@@ -2636,7 +2619,7 @@ paste_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_paste_clipboard(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_PASTE);
        }
 
@@ -2667,7 +2650,7 @@ delete_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_delete_selection(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_CLEAR_SELECTION);
        }
 
@@ -2698,7 +2681,7 @@ selectall_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_select_region(GTK_EDITABLE(focused), 0, -1);
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_SELECT_ALL);
        }
 
@@ -2721,7 +2704,7 @@ preferences_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        GtkWidget *toplevel;
        GtkWidget *wndpreferences;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2747,7 +2730,7 @@ zoomplus_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_set_scale(bw, 0.05, false);
 
@@ -2768,7 +2751,7 @@ zoomminus_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_set_scale(bw, -0.05, false);
 
@@ -2790,7 +2773,7 @@ zoomnormal_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_set_scale(bw, 1.0, true);
 
@@ -2840,7 +2823,7 @@ viewsource_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        struct browser_window *bw;
        GtkWindow *gtkwindow; /* gtk window widget is in */
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        gtkwindow = GTK_WINDOW(gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW));
 
@@ -2917,7 +2900,7 @@ toggledebugging_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_debug(bw, CONTENT_DEBUG_REDRAW);
 
@@ -2959,7 +2942,7 @@ debugboxtree_button_clicked_cb(GtkWidget *widget, 
gpointer data)
                return TRUE;
        }
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_debug_dump(bw, f, CONTENT_DEBUG_RENDER);
 
@@ -3004,7 +2987,7 @@ debugdomtree_button_clicked_cb(GtkWidget *widget, 
gpointer data)
                return TRUE;
        }
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_debug_dump(bw, f, CONTENT_DEBUG_DOM);
 
@@ -3036,7 +3019,7 @@ localhistory_button_clicked_cb(GtkWidget *widget, 
gpointer data)
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
        if (toplevel != NULL) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
 
                res = nsgtk_local_history_present(GTK_WINDOW(toplevel), bw);
                if (res != NSERROR_OK) {
@@ -3081,7 +3064,7 @@ addbookmarks_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);
+       bw = tb->get_bw(tb->get_ctx);
        if (browser_window_has_content(bw)) {
                hotlist_add_url(browser_window_access_url(bw));
        }
@@ -3366,7 +3349,7 @@ toolbar_connect_signal(struct nsgtk_toolbar *tb, 
nsgtk_toolbar_button itemid)
 
                nsgtk_completion_connect_signals(entry,
                                                 tb->get_bw,
-                                                tb->get_bw_ctx);
+                                                tb->get_ctx);
                break;
 
 
@@ -3417,11 +3400,41 @@ static nserror toolbar_connect_signals(struct 
nsgtk_toolbar *tb)
        return NSERROR_OK;
 }
 
+/**
+ * signal handler for toolbar context menu
+ *
+ * \param toolbar The toolbar event is being delivered to
+ * \param x The x coordinate where the click happened
+ * \param y The x coordinate where the click happened
+ * \param button the buttons being pressed
+ * \param data The context pointer passed when the connection was made.
+ * \return TRUE to indicate signal handled.
+ */
+static gboolean
+toolbar_popup_context_menu_cb(GtkToolbar *toolbar,
+                             gint x,
+                             gint y,
+                             gint button,
+                             gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct gui_window *gw;
+       struct nsgtk_scaffolding *gs;
+
+       gw = tb->get_ctx; /** \todo stop assuming the context is a gui window */
+
+       gs = nsgtk_get_scaffold(gw);
+
+       nsgtk_scaffolding_toolbar_context_menu(gs);
+
+       return TRUE;
+}
+
 /* exported interface documented in toolbar.h */
 nserror
 nsgtk_toolbar_create(GtkBuilder *builder,
                     struct browser_window *(*get_bw)(void *ctx),
-                    void *get_bw_ctx,
+                    void *get_ctx,
                     struct nsgtk_toolbar **tb_out)
 {
        nserror res;
@@ -3434,13 +3447,18 @@ nsgtk_toolbar_create(GtkBuilder *builder,
        }
 
        tb->get_bw = get_bw;
-       tb->get_bw_ctx = get_bw_ctx;
+       tb->get_ctx = get_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);
 
+       g_signal_connect(tb->widget,
+                        "popup-context-menu",
+                        G_CALLBACK(toolbar_popup_context_menu_cb),
+                        tb);
+
        /* allocate button contexts */
        for (bidx = BACK_BUTTON; bidx < PLACEHOLDER_BUTTON; bidx++) {
                res = toolbar_item_create(bidx, &tb->buttons[bidx]);
@@ -3543,7 +3561,7 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, 
bool active)
        nserror res;
        struct browser_window *bw;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        /* when activating the throbber simply schedule the next frame update */
        if (active) {
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index 9bbb300..fbfa5e5 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -100,7 +100,7 @@ TOOLBAR_ITEM(THROBBER_ITEM, throbber, true, NULL)
 TOOLBAR_ITEM(NEWWINDOW_BUTTON, newwindow, true, newwindow_button_clicked_cb)
 TOOLBAR_ITEM(NEWTAB_BUTTON, newtab, true, newtab_button_clicked_cb)
 TOOLBAR_ITEM(OPENFILE_BUTTON, openfile, true, openfile_button_clicked_cb)
-TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false, closetab_button_clicked_cb)
+TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false, NULL)
 TOOLBAR_ITEM(CLOSEWINDOW_BUTTON, closewindow, true, 
closewindow_button_clicked_cb)
 TOOLBAR_ITEM(SAVEPAGE_BUTTON, savepage, true, savepage_button_clicked_cb)
 TOOLBAR_ITEM(PDF_BUTTON, pdf, false, pdf_button_clicked_cb)


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

Summary of changes:
 frontends/gtk/scaffolding.c   |  523 +++++++++++++++++++++--------------------
 frontends/gtk/scaffolding.h   |    5 +
 frontends/gtk/toolbar.c       |  122 ++++++----
 frontends/gtk/toolbar_items.h |    2 +-
 4 files changed, 350 insertions(+), 302 deletions(-)

diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index d7e7d59..a7414eb 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -79,29 +79,6 @@
 #include "gtk/resources.h"
 #include "gtk/layout_pango.h"
 
-/** Macro to define a handler for menu, button and activate events. */
-#define MULTIHANDLER(q)\
-static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g);\
-static gboolean nsgtk_on_##q##_activate_menu(GtkMenuItem *widget, gpointer 
data)\
-{\
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;\
-       return nsgtk_on_##q##_activate(g);\
-}\
-static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g)
-
-
-/**
- * handle menu activate signals by calling toolbar item activation
- */
-#define MENUHANDLER(name, itemid)                                      \
-static gboolean                                                                
\
-nsgtk_on_##name##_activate_menu(GtkMenuItem *widget, gpointer data)    \
-{                                                                      \
-       struct nsgtk_scaffolding *gs = (struct nsgtk_scaffolding *)data;\
-       nsgtk_window_item_activate(gs->top_level, itemid);              \
-       return TRUE;                                                    \
-}
-
 
 /**
  * menu entry context
@@ -464,33 +441,16 @@ nsgtk_window_url_changed(GtkWidget *widget,
        return nsgtk_completion_update(GTK_ENTRY(widget));
 }
 
-
-/**
- * Event handler for popup menu on toolbar.
- *
- * \param toolbar The toolbar being clicked
- * \param x The x coordinate where the click happened
- * \param y The x coordinate where the click happened
- * \param button the buttons being pressed
- * \param data The context pointer passed when the connection was made.
- * \return TRUE to indicate event handled.
- */
-static gboolean
-nsgtk_window_tool_bar_clicked(GtkToolbar *toolbar,
-                             gint x,
-                             gint y,
-                             gint button,
-                             gpointer data)
+/* exported interface documented in gtk/scaffolding.h */
+nserror nsgtk_scaffolding_toolbar_context_menu(struct nsgtk_scaffolding *gs)
 {
-       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-
        /* set visibility for right-click popup menu */
-       popup_menu_hide(g->menu_popup, true, false, true, false);
-       popup_menu_show(g->menu_popup, false, false, false, true);
+       popup_menu_hide(gs->menu_popup, true, false, true, false);
+       popup_menu_show(gs->menu_popup, false, false, false, true);
 
-       nsgtk_menu_popup_at_pointer(g->menu_popup->popup_menu, NULL);
+       nsgtk_menu_popup_at_pointer(gs->menu_popup->popup_menu, NULL);
 
-       return TRUE;
+       return NSERROR_OK;
 }
 
 
@@ -574,6 +534,18 @@ nsgtk_window_tabs_remove(GtkNotebook *notebook,
 /* signal handlers for menu entries */
 
 /**
+ * handle menu activate signals by calling toolbar item activation
+ */
+#define MENUHANDLER(name, itemid)                                      \
+static gboolean                                                                
\
+nsgtk_on_##name##_activate_menu(GtkMenuItem *widget, gpointer data)    \
+{                                                                      \
+       struct nsgtk_scaffolding *gs = (struct nsgtk_scaffolding *)data;\
+       nsgtk_window_item_activate(gs->top_level, itemid);              \
+       return TRUE;                                                    \
+}
+
+/**
  * menu signal handler for activation on new window item
  */
 MENUHANDLER(newwindow, NEWWINDOW_BUTTON);
@@ -623,6 +595,165 @@ MENUHANDLER(closewindow, CLOSEWINDOW_BUTTON);
  */
 MENUHANDLER(quit, QUIT_BUTTON);
 
+/**
+ * menu signal handler for activation on cut item
+ */
+MENUHANDLER(cut, CUT_BUTTON);
+
+/**
+ * menu signal handler for activation on copy item
+ */
+MENUHANDLER(copy, COPY_BUTTON);
+
+/**
+ * menu signal handler for activation on paste item
+ */
+MENUHANDLER(paste, PASTE_BUTTON);
+
+/**
+ * menu signal handler for activation on delete item
+ */
+MENUHANDLER(delete, DELETE_BUTTON);
+
+
+
+/**
+ * menu signal handler for activation on selectall item
+ */
+MENUHANDLER(selectall, SELECTALL_BUTTON);
+
+/**
+ * menu signal handler for activation on preferences item
+ */
+MENUHANDLER(preferences, PREFERENCES_BUTTON);
+
+/**
+ * menu signal handler for activation on zoom plus item
+ */
+MENUHANDLER(zoomplus, ZOOMPLUS_BUTTON);
+
+/**
+ * menu signal handler for activation on zoom minus item
+ */
+MENUHANDLER(zoomminus, ZOOMMINUS_BUTTON);
+
+/**
+ * menu signal handler for activation on zoom normal item
+ */
+MENUHANDLER(zoomnormal, ZOOMNORMAL_BUTTON);
+
+/**
+ * menu signal handler for activation on full screen item
+ */
+MENUHANDLER(fullscreen, FULLSCREEN_BUTTON);
+
+/**
+ * menu signal handler for activation on view source item
+ */
+MENUHANDLER(viewsource, VIEWSOURCE_BUTTON);
+
+/**
+ * menu signal handler for activation on downloads item
+ */
+MENUHANDLER(downloads, DOWNLOADS_BUTTON);
+
+/**
+ * menu signal handler for activation on save window size item
+ */
+MENUHANDLER(savewindowsize, SAVEWINDOWSIZE_BUTTON);
+
+/**
+ * menu signal handler for activation on toggle debug render item
+ */
+MENUHANDLER(toggledebugging, TOGGLEDEBUGGING_BUTTON);
+
+/**
+ * menu signal handler for activation on debug box tree item
+ */
+MENUHANDLER(debugboxtree, SAVEBOXTREE_BUTTON);
+
+/**
+ * menu signal handler for activation on debug dom tree item
+ */
+MENUHANDLER(debugdomtree, SAVEDOMTREE_BUTTON);
+
+/**
+ * menu signal handler for activation on stop item
+ */
+MENUHANDLER(stop, STOP_BUTTON);
+
+/**
+ * menu signal handler for activation on reload item
+ */
+MENUHANDLER(reload, RELOAD_BUTTON);
+
+/**
+ * menu signal handler for activation on back item
+ */
+MENUHANDLER(back, BACK_BUTTON);
+
+/**
+ * menu signal handler for activation on forward item
+ */
+MENUHANDLER(forward, FORWARD_BUTTON);
+
+/**
+ * menu signal handler for activation on home item
+ */
+MENUHANDLER(home, HOME_BUTTON);
+
+/**
+ * menu signal handler for activation on localhistory item
+ */
+MENUHANDLER(localhistory, LOCALHISTORY_BUTTON);
+
+/**
+ * menu signal handler for activation on globalhistory item
+ */
+MENUHANDLER(globalhistory, GLOBALHISTORY_BUTTON);
+
+/**
+ * menu signal handler for activation on addbookmarks item
+ */
+MENUHANDLER(addbookmarks, ADDBOOKMARKS_BUTTON);
+
+/**
+ * menu signal handler for activation on showbookmarks item
+ */
+MENUHANDLER(showbookmarks, SHOWBOOKMARKS_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(showcookies, SHOWCOOKIES_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(openlocation, OPENLOCATION_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(contents, CONTENTS_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(guide, GUIDE_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(info, INFO_BUTTON);
+
+/**
+ * menu signal handler for activation on showcookies item
+ */
+MENUHANDLER(about, ABOUT_BUTTON);
+
+#undef MENUHANDLER
+
 
 static gboolean
 nsgtk_on_savelink_activate_menu(GtkMenuItem *widget, gpointer data)
@@ -649,6 +780,7 @@ nsgtk_on_savelink_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for opening new window from a link. attached to the popup menu.
  */
@@ -672,6 +804,7 @@ nsgtk_on_link_openwin_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for opening new tab from a link. attached to the popup menu.
  */
@@ -701,6 +834,7 @@ nsgtk_on_link_opentab_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for bookmarking a link. attached to the popup menu.
  */
@@ -715,6 +849,7 @@ nsgtk_on_link_bookmark_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
+
 /**
  * Handler for copying a link. attached to the popup menu.
  */
@@ -734,27 +869,6 @@ nsgtk_on_link_copy_activate_menu(GtkMenuItem *widget, 
gpointer data)
 }
 
 
-/**
- * menu signal handler for activation on cut item
- */
-MENUHANDLER(cut, CUT_BUTTON);
-
-/**
- * menu signal handler for activation on copy item
- */
-MENUHANDLER(copy, COPY_BUTTON);
-
-/**
- * menu signal handler for activation on paste item
- */
-MENUHANDLER(paste, PASTE_BUTTON);
-
-/**
- * menu signal handler for activation on delete item
- */
-MENUHANDLER(delete, DELETE_BUTTON);
-
-
 static gboolean
 nsgtk_on_customize_activate_menu(GtkMenuItem *widget, gpointer data)
 {
@@ -763,48 +877,15 @@ nsgtk_on_customize_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
-/**
- * menu signal handler for activation on selectall item
- */
-MENUHANDLER(selectall, SELECTALL_BUTTON);
 
-
-MULTIHANDLER(find)
+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);
        return TRUE;
 }
 
-/**
- * menu signal handler for activation on preferences item
- */
-MENUHANDLER(preferences, PREFERENCES_BUTTON);
-
-/**
- * menu signal handler for activation on zoom plus item
- */
-MENUHANDLER(zoomplus, ZOOMPLUS_BUTTON);
-
-/**
- * menu signal handler for activation on zoom minus item
- */
-MENUHANDLER(zoomminus, ZOOMMINUS_BUTTON);
-
-/**
- * menu signal handler for activation on zoom normal item
- */
-MENUHANDLER(zoomnormal, ZOOMNORMAL_BUTTON);
-
-/**
- * menu signal handler for activation on full screen item
- */
-MENUHANDLER(fullscreen, FULLSCREEN_BUTTON);
-
-/**
- * menu signal handler for activation on view source item
- */
-MENUHANDLER(viewsource, VIEWSOURCE_BUTTON);
-
 
 static gboolean
 nsgtk_on_menubar_activate_menu(GtkMenuItem *widget, gpointer data)
@@ -888,102 +969,29 @@ nsgtk_on_toolbar_activate_menu(GtkMenuItem *widget, 
gpointer data)
        return TRUE;
 }
 
-/**
- * menu signal handler for activation on downloads item
- */
-MENUHANDLER(downloads, DOWNLOADS_BUTTON);
-
-/**
- * menu signal handler for activation on save window size item
- */
-MENUHANDLER(savewindowsize, SAVEWINDOWSIZE_BUTTON);
-
-/**
- * menu signal handler for activation on toggle debug render item
- */
-MENUHANDLER(toggledebugging, TOGGLEDEBUGGING_BUTTON);
-
-/**
- * menu signal handler for activation on debug box tree item
- */
-MENUHANDLER(debugboxtree, SAVEBOXTREE_BUTTON);
-
-/**
- * menu signal handler for activation on debug dom tree item
- */
-MENUHANDLER(debugdomtree, SAVEDOMTREE_BUTTON);
-
-/**
- * menu signal handler for activation on stop item
- */
-MENUHANDLER(stop, STOP_BUTTON);
-
-/**
- * menu signal handler for activation on reload item
- */
-MENUHANDLER(reload, RELOAD_BUTTON);
-
-/**
- * menu signal handler for activation on back item
- */
-MENUHANDLER(back, BACK_BUTTON);
-
-/**
- * menu signal handler for activation on forward item
- */
-MENUHANDLER(forward, FORWARD_BUTTON);
 
-/**
- * menu signal handler for activation on home item
- */
-MENUHANDLER(home, HOME_BUTTON);
-
-/**
- * menu signal handler for activation on localhistory item
- */
-MENUHANDLER(localhistory, LOCALHISTORY_BUTTON);
-
-/**
- * menu signal handler for activation on globalhistory item
- */
-MENUHANDLER(globalhistory, GLOBALHISTORY_BUTTON);
-
-/**
- * menu signal handler for activation on addbookmarks item
- */
-MENUHANDLER(addbookmarks, ADDBOOKMARKS_BUTTON);
-
-/**
- * menu signal handler for activation on showbookmarks item
- */
-MENUHANDLER(showbookmarks, SHOWBOOKMARKS_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(showcookies, SHOWCOOKIES_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(openlocation, OPENLOCATION_BUTTON);
-
-
-MULTIHANDLER(nexttab)
+static gboolean
+nsgtk_on_nexttab_activate_menu(GtkMenuItem *widget, gpointer data)
 {
+       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
+
        nsgtk_tab_next(g->notebook);
 
        return TRUE;
 }
 
-MULTIHANDLER(prevtab)
+
+static gboolean
+nsgtk_on_prevtab_activate_menu(GtkMenuItem *widget, gpointer data)
 {
+       struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
 
        nsgtk_tab_prev(g->notebook);
 
        return TRUE;
 }
 
+
 /**
  * menu signal handler for activation on close tab item
  */
@@ -991,33 +999,13 @@ static gboolean
 nsgtk_on_closetab_activate_menu(GtkMenuItem *widget, gpointer data)
 {
        struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
-       nsgtk_window_item_activate(g->top_level, CLOSETAB_BUTTON);
-       return TRUE;
-}
 
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(contents, CONTENTS_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(guide, GUIDE_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(info, INFO_BUTTON);
-
-/**
- * menu signal handler for activation on showcookies item
- */
-MENUHANDLER(about, ABOUT_BUTTON);
+       nsgtk_tab_close_current(g->notebook);
 
+       return TRUE;
+}
 
-#undef MULTIHANDLER
-#undef MENUHANDLER
+/* end of menu callback handlers */
 
 /**
  * attach gtk signal handlers for menus
@@ -1322,7 +1310,9 @@ static nserror nsgtk_search_update(struct gtk_search 
*search)
        return NSERROR_OK;
 }
 
-
+/**
+ * create text search context
+ */
 static nserror
 nsgtk_search_create(GtkBuilder *builder, struct gtk_search **search_out)
 {
@@ -1350,6 +1340,50 @@ nsgtk_search_create(GtkBuilder *builder, struct 
gtk_search **search_out)
        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;
 }
 
@@ -1471,6 +1505,7 @@ nsgtk_scaffolding_set_websearch(struct nsgtk_scaffolding 
*g, const char *content
 #endif
 }
 
+
 /**
  * GTK UI callback when search provider details are updated.
  *
@@ -1789,8 +1824,10 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct 
gui_window *toplevel)
 
        gtk_builder_connect_signals(gs->builder, NULL);
 
-       gs->window = GTK_WINDOW(gtk_builder_get_object(gs->builder, 
"wndBrowser"));
-       gs->notebook = GTK_NOTEBOOK(gtk_builder_get_object(gs->builder, 
"notebook"));
+       gs->window = GTK_WINDOW(gtk_builder_get_object(gs->builder,
+                                                      "wndBrowser"));
+       gs->notebook = GTK_NOTEBOOK(gtk_builder_get_object(gs->builder,
+                                                          "notebook"));
 
 
        res = nsgtk_search_create(gs->builder, &gs->search);
@@ -1825,50 +1862,38 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct 
gui_window *toplevel)
 
        nsgtk_tab_init(gs);
 
-       g_signal_connect_after(gs->notebook, "page-added",
-                       G_CALLBACK(nsgtk_window_tabs_add), gs);
-       g_signal_connect_after(gs->notebook, "page-removed",
-                       G_CALLBACK(nsgtk_window_tabs_remove), gs);
-
-#define CONNECT(obj, sig, callback, ptr) \
-       g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
+       g_signal_connect_after(gs->notebook,
+                              "page-added",
+                              G_CALLBACK(nsgtk_window_tabs_add),
+                              gs);
+       g_signal_connect_after(gs->notebook,
+                              "page-removed",
+                              G_CALLBACK(nsgtk_window_tabs_remove),
+                              gs);
 
        /* connect main window signals to their handlers. */
-       CONNECT(gs->window,
-               "delete-event",
-               scaffolding_window_delete_event,
-               gs);
+       g_signal_connect(gs->window,
+                        "delete-event",
+                        G_CALLBACK(scaffolding_window_delete_event),
+                        gs);
 
-       CONNECT(gs->window, "destroy", scaffolding_window_destroy, gs);
+       g_signal_connect(gs->window,
+                        "destroy",
+                        G_CALLBACK(scaffolding_window_destroy),
+                        gs);
 
        /* toolbar URL bar menu bar search bar signal handlers */
-       CONNECT(gs->menu_bar->edit_submenu->edit, "show",
-               nsgtk_window_edit_menu_shown, gs);
-       CONNECT(gs->menu_bar->edit_submenu->edit, "hide",
-               nsgtk_window_edit_menu_hidden, gs);
-
-       CONNECT(gs->search->buttons[1], "clicked",
-                       nsgtk_search_forward_button_clicked, gs);
+       g_signal_connect(gs->menu_bar->edit_submenu->edit,
+                        "show",
+                        G_CALLBACK(nsgtk_window_edit_menu_shown),
+                        gs);
 
-       CONNECT(gs->search->buttons[0], "clicked",
-                       nsgtk_search_back_button_clicked, gs);
-
-       CONNECT(gs->search->entry, "changed", nsgtk_search_entry_changed, gs);
-
-       CONNECT(gs->search->entry, "activate", nsgtk_search_entry_activate, gs);
-
-       CONNECT(gs->search->entry, "key-press-event",
-               nsgtk_search_entry_key, gs);
-
-       CONNECT(gs->search->buttons[2], "clicked",
-               nsgtk_search_close_button_clicked, gs);
-
-       CONNECT(gs->search->caseSens, "toggled",
-               nsgtk_search_entry_changed, gs);
+       g_signal_connect(gs->menu_bar->edit_submenu->edit,
+                        "hide",
+                        G_CALLBACK(nsgtk_window_edit_menu_hidden),
+                        gs);
 
-       /** \todo fix popup menu */
-       //CONNECT(gs->tool_bar, "popup-context-menu",
-       //      nsgtk_window_tool_bar_clicked, gs);
+       nsgtk_search_connect_signals(gs);
 
        /* create popup menu */
        gs->menu_popup = nsgtk_new_scaffolding_popup(gs, group);
diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h
index 666bc50..a8cea20 100644
--- a/frontends/gtk/scaffolding.h
+++ b/frontends/gtk/scaffolding.h
@@ -69,6 +69,11 @@ nserror nsgtk_scaffolding_destroy_all(void);
 nserror nsgtk_scaffolding_throbber(struct gui_window* gw, bool active);
 
 /**
+ * open a toolbar context menu
+ */
+nserror nsgtk_scaffolding_toolbar_context_menu(struct nsgtk_scaffolding *gs);
+
+/**
  * Obtain the most recently used scaffolding element.
  *
  * This allows tabs to be opened in the most recently used window
diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c
index fafa194..694c271 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -66,6 +66,7 @@
 #include "gtk/preferences.h"
 #include "gtk/hotlist.h"
 #include "gtk/cookies.h"
+#include "gtk/about.h"
 #include "gtk/toolbar.h"
 
 /**
@@ -131,7 +132,7 @@ struct nsgtk_toolbar {
        /**
         * context passed to get_bw function
         */
-       void *get_bw_ctx;
+       void *get_ctx;
 };
 
 
@@ -1722,7 +1723,7 @@ toolbar_navigate_to_url(struct nsgtk_toolbar *tb, const 
char *urltxt)
                return res;
        }
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        res = browser_window_navigate(bw,
                                      url,
@@ -1872,7 +1873,7 @@ 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);
+       bw = tb->get_bw(tb->get_ctx);
 
        if ((bw != NULL) && browser_window_history_back_available(bw)) {
                /* clear potential search effects */
@@ -1904,7 +1905,7 @@ 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);
+       bw = tb->get_bw(tb->get_ctx);
 
        if ((bw != NULL) && browser_window_history_forward_available(bw)) {
                /* clear potential search effects */
@@ -1934,7 +1935,7 @@ 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));
+       browser_window_stop(tb->get_bw(tb->get_ctx));
 
        return TRUE;
 }
@@ -1953,7 +1954,7 @@ 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);
+       bw = tb->get_bw(tb->get_ctx);
 
        /* clear potential search effects */
        browser_window_search_clear(bw);
@@ -2013,7 +2014,7 @@ static gboolean url_entry_activate_cb(GtkWidget *widget, 
gpointer data)
                              SEARCH_WEB_OMNI_NONE,
                              &url);
        if (res == NSERROR_OK) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                res = browser_window_navigate(
                        bw, url, NULL, BW_NAVIGATE_HISTORY, NULL, NULL, NULL);
                nsurl_unref(url);
@@ -2067,7 +2068,7 @@ static gboolean websearch_entry_activate_cb(GtkWidget 
*widget, gpointer data)
                              &url);
        if (res == NSERROR_OK) {
                temp_open_background = 0;
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
 
                res = browser_window_create(
                        BW_CREATE_HISTORY | BW_CREATE_TAB,
@@ -2133,7 +2134,7 @@ newwindow_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 
        res = nsurl_create(addr, &url);
        if (res == NSERROR_OK) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                res = browser_window_create(BW_CREATE_HISTORY,
                                              url,
                                              NULL,
@@ -2175,7 +2176,7 @@ newtab_button_clicked_cb(GtkWidget *widget, gpointer data)
        }
 
        if (res == NSERROR_OK) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
 
                res = browser_window_create(BW_CREATE_HISTORY |
                                            BW_CREATE_TAB,
@@ -2234,7 +2235,7 @@ openfile_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 
                        res = nsurl_create(urltxt, &url);
                        if (res == NSERROR_OK) {
-                               bw = tb->get_bw(tb->get_bw_ctx);
+                               bw = tb->get_bw(tb->get_ctx);
                                res = browser_window_navigate(bw,
                                                        url,
                                                        NULL,
@@ -2261,24 +2262,6 @@ openfile_button_clicked_cb(GtkWidget *widget, gpointer 
data)
 
 
 /**
- * handler for close tab 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
-closetab_button_clicked_cb(GtkWidget *widget, gpointer data)
-{
-       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
-
-       nsgtk_tab_close_current(GTK_NOTEBOOK(tb->widget));
-
-       return TRUE;
-}
-
-
-/**
  * handler for close window tool bar item clicked signal
  *
  * \param widget The widget the signal is being delivered to.
@@ -2312,7 +2295,7 @@ savepage_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        nserror res;
        GtkWidget *toplevel;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
        res = nsgtk_saveas_dialog(bw,
@@ -2363,7 +2346,7 @@ pdf_button_clicked_cb(GtkWidget *widget, gpointer data)
        gchar *filename;
        nserror res;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2415,7 +2398,7 @@ plaintext_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        gchar *filename;
        nserror res;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2456,7 +2439,7 @@ print_button_clicked_cb(GtkWidget *widget, gpointer data)
        char *settings_fname = NULL;
        GtkWidget *toplevel;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2574,7 +2557,7 @@ cut_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_cut_clipboard(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_CUT_SELECTION);
        }
 
@@ -2605,7 +2588,7 @@ copy_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_copy_clipboard(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_COPY_SELECTION);
        }
 
@@ -2636,7 +2619,7 @@ paste_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_paste_clipboard(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_PASTE);
        }
 
@@ -2667,7 +2650,7 @@ delete_button_clicked_cb(GtkWidget *widget, gpointer data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_delete_selection(GTK_EDITABLE(focused));
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_CLEAR_SELECTION);
        }
 
@@ -2698,7 +2681,7 @@ selectall_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        if (GTK_IS_EDITABLE(focused)) {
                gtk_editable_select_region(GTK_EDITABLE(focused), 0, -1);
        } else {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
                browser_window_key_press(bw, NS_KEY_SELECT_ALL);
        }
 
@@ -2721,7 +2704,7 @@ preferences_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        GtkWidget *toplevel;
        GtkWidget *wndpreferences;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
 
@@ -2747,7 +2730,7 @@ zoomplus_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_set_scale(bw, 0.05, false);
 
@@ -2768,7 +2751,7 @@ zoomminus_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_set_scale(bw, -0.05, false);
 
@@ -2790,7 +2773,7 @@ zoomnormal_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_set_scale(bw, 1.0, true);
 
@@ -2840,7 +2823,7 @@ viewsource_button_clicked_cb(GtkWidget *widget, gpointer 
data)
        struct browser_window *bw;
        GtkWindow *gtkwindow; /* gtk window widget is in */
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        gtkwindow = GTK_WINDOW(gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW));
 
@@ -2917,7 +2900,7 @@ toggledebugging_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);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_debug(bw, CONTENT_DEBUG_REDRAW);
 
@@ -2959,7 +2942,7 @@ debugboxtree_button_clicked_cb(GtkWidget *widget, 
gpointer data)
                return TRUE;
        }
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_debug_dump(bw, f, CONTENT_DEBUG_RENDER);
 
@@ -3004,7 +2987,7 @@ debugdomtree_button_clicked_cb(GtkWidget *widget, 
gpointer data)
                return TRUE;
        }
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        browser_window_debug_dump(bw, f, CONTENT_DEBUG_DOM);
 
@@ -3036,7 +3019,7 @@ localhistory_button_clicked_cb(GtkWidget *widget, 
gpointer data)
 
        toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
        if (toplevel != NULL) {
-               bw = tb->get_bw(tb->get_bw_ctx);
+               bw = tb->get_bw(tb->get_ctx);
 
                res = nsgtk_local_history_present(GTK_WINDOW(toplevel), bw);
                if (res != NSERROR_OK) {
@@ -3081,7 +3064,7 @@ addbookmarks_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);
+       bw = tb->get_bw(tb->get_ctx);
        if (browser_window_has_content(bw)) {
                hotlist_add_url(browser_window_access_url(bw));
        }
@@ -3366,7 +3349,7 @@ toolbar_connect_signal(struct nsgtk_toolbar *tb, 
nsgtk_toolbar_button itemid)
 
                nsgtk_completion_connect_signals(entry,
                                                 tb->get_bw,
-                                                tb->get_bw_ctx);
+                                                tb->get_ctx);
                break;
 
 
@@ -3417,11 +3400,41 @@ static nserror toolbar_connect_signals(struct 
nsgtk_toolbar *tb)
        return NSERROR_OK;
 }
 
+/**
+ * signal handler for toolbar context menu
+ *
+ * \param toolbar The toolbar event is being delivered to
+ * \param x The x coordinate where the click happened
+ * \param y The x coordinate where the click happened
+ * \param button the buttons being pressed
+ * \param data The context pointer passed when the connection was made.
+ * \return TRUE to indicate signal handled.
+ */
+static gboolean
+toolbar_popup_context_menu_cb(GtkToolbar *toolbar,
+                             gint x,
+                             gint y,
+                             gint button,
+                             gpointer data)
+{
+       struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+       struct gui_window *gw;
+       struct nsgtk_scaffolding *gs;
+
+       gw = tb->get_ctx; /** \todo stop assuming the context is a gui window */
+
+       gs = nsgtk_get_scaffold(gw);
+
+       nsgtk_scaffolding_toolbar_context_menu(gs);
+
+       return TRUE;
+}
+
 /* exported interface documented in toolbar.h */
 nserror
 nsgtk_toolbar_create(GtkBuilder *builder,
                     struct browser_window *(*get_bw)(void *ctx),
-                    void *get_bw_ctx,
+                    void *get_ctx,
                     struct nsgtk_toolbar **tb_out)
 {
        nserror res;
@@ -3434,13 +3447,18 @@ nsgtk_toolbar_create(GtkBuilder *builder,
        }
 
        tb->get_bw = get_bw;
-       tb->get_bw_ctx = get_bw_ctx;
+       tb->get_ctx = get_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);
 
+       g_signal_connect(tb->widget,
+                        "popup-context-menu",
+                        G_CALLBACK(toolbar_popup_context_menu_cb),
+                        tb);
+
        /* allocate button contexts */
        for (bidx = BACK_BUTTON; bidx < PLACEHOLDER_BUTTON; bidx++) {
                res = toolbar_item_create(bidx, &tb->buttons[bidx]);
@@ -3543,7 +3561,7 @@ nserror nsgtk_toolbar_throbber(struct nsgtk_toolbar *tb, 
bool active)
        nserror res;
        struct browser_window *bw;
 
-       bw = tb->get_bw(tb->get_bw_ctx);
+       bw = tb->get_bw(tb->get_ctx);
 
        /* when activating the throbber simply schedule the next frame update */
        if (active) {
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index 9bbb300..fbfa5e5 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -100,7 +100,7 @@ TOOLBAR_ITEM(THROBBER_ITEM, throbber, true, NULL)
 TOOLBAR_ITEM(NEWWINDOW_BUTTON, newwindow, true, newwindow_button_clicked_cb)
 TOOLBAR_ITEM(NEWTAB_BUTTON, newtab, true, newtab_button_clicked_cb)
 TOOLBAR_ITEM(OPENFILE_BUTTON, openfile, true, openfile_button_clicked_cb)
-TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false, closetab_button_clicked_cb)
+TOOLBAR_ITEM(CLOSETAB_BUTTON, closetab, false, NULL)
 TOOLBAR_ITEM(CLOSEWINDOW_BUTTON, closewindow, true, 
closewindow_button_clicked_cb)
 TOOLBAR_ITEM(SAVEPAGE_BUTTON, savepage, true, savepage_button_clicked_cb)
 TOOLBAR_ITEM(PDF_BUTTON, pdf, false, pdf_button_clicked_cb)


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