summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontends/gtk/scaffolding.c233
-rw-r--r--frontends/gtk/scaffolding.h8
-rw-r--r--frontends/gtk/toolbar.c200
-rw-r--r--frontends/gtk/toolbar_items.h14
4 files changed, 291 insertions, 164 deletions
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index ceccda925..309ee041f 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -95,6 +95,19 @@ static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g)
static gboolean nsgtk_on_##q##_activate(GtkButton *widget, gpointer data)
/**
+ * 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
*/
struct nsgtk_menu {
@@ -604,122 +617,52 @@ static void nsgtk_openfile_open(const char *filename)
/**
* menu signal handler for activation on new window item
*/
-static gboolean
-nsgtk_on_newwindow_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, NEWWINDOW_BUTTON);
- return TRUE;
-}
+MENUHANDLER(newwindow, NEWWINDOW_BUTTON);
/**
* menu signal handler for activation on new tab item
*/
-static gboolean
-nsgtk_on_newtab_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, NEWTAB_BUTTON);
- return TRUE;
-}
+MENUHANDLER(newtab, NEWTAB_BUTTON);
/**
* menu signal handler for activation on open file item
*/
-static gboolean
-nsgtk_on_openfile_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, OPENFILE_BUTTON);
- return TRUE;
-}
-
+MENUHANDLER(openfile, OPENFILE_BUTTON);
/**
* menu signal handler for activation on export complete page item
*/
-static gboolean
-nsgtk_on_savepage_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, SAVEPAGE_BUTTON);
- return TRUE;
-}
-
+MENUHANDLER(savepage, SAVEPAGE_BUTTON);
/**
* menu signal handler for activation on export pdf item
*/
-static gboolean
-nsgtk_on_pdf_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, PDF_BUTTON);
- return TRUE;
-}
+MENUHANDLER(pdf, PDF_BUTTON);
/**
* menu signal handler for activation on export plain text item
*/
-static gboolean
-nsgtk_on_plaintext_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, PLAINTEXT_BUTTON);
- return TRUE;
-}
-
+MENUHANDLER(plaintext, PLAINTEXT_BUTTON);
/**
* menu signal handler for activation on print preview item
*/
-static gboolean
-nsgtk_on_printpreview_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, PRINTPREVIEW_BUTTON);
- return TRUE;
-}
-
+MENUHANDLER(printpreview, PRINTPREVIEW_BUTTON);
/**
* menu signal handler for activation on print item
*/
-static gboolean
-nsgtk_on_print_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, PRINT_BUTTON);
- return TRUE;
-}
-
+MENUHANDLER(print, PRINT_BUTTON);
/**
* menu signal handler for activation on close window item
*/
-static gboolean
-nsgtk_on_closewindow_activate_menu(GtkMenuItem *widget, gpointer data)
-{
- struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data;
- nsgtk_window_item_activate(g->top_level, CLOSEWINDOW_BUTTON);
- return TRUE;
-}
-
-
-MULTIHANDLER(quit)
-{
- struct nsgtk_scaffolding *gs;
-
- if (nsgtk_check_for_downloads(g->window) == false) {
- gs = scaf_list;
- while (gs != NULL) {
- gtk_widget_destroy(GTK_WIDGET(gs->window));
- gs = gs->next;
- }
- }
+MENUHANDLER(closewindow, CLOSEWINDOW_BUTTON);
- return TRUE;
-}
+/**
+ * menu signal handler for activation on close window item
+ */
+MENUHANDLER(quit, QUIT_BUTTON);
static gboolean
@@ -832,54 +775,25 @@ nsgtk_on_link_copy_activate_menu(GtkMenuItem *widget, gpointer data)
}
-MULTIHANDLER(cut)
-{
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- GtkWidget *focused = gtk_window_get_focus(g->window);
-
- /* If the url bar has focus, let gtk handle it */
- if (GTK_IS_EDITABLE (focused))
- //gtk_editable_cut_clipboard (GTK_EDITABLE(g->url_bar));
- ;
- else
- browser_window_key_press(bw, NS_KEY_CUT_SELECTION);
-
- return TRUE;
-}
-
-MULTIHANDLER(copy)
-{
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- GtkWidget *focused = gtk_window_get_focus(g->window);
-
- /* If the url bar has focus, let gtk handle it */
- if (GTK_IS_EDITABLE (focused))
- //gtk_editable_copy_clipboard(GTK_EDITABLE(g->url_bar));
- ;
- else
- browser_window_key_press(bw, NS_KEY_COPY_SELECTION);
-
- return TRUE;
-}
-
-MULTIHANDLER(paste)
-{
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- GtkWidget *focused = gtk_window_get_focus(g->window);
+/**
+ * menu signal handler for activation on cut item
+ */
+MENUHANDLER(cut, CUT_BUTTON);
- /* If the url bar has focus, let gtk handle it */
- if (GTK_IS_EDITABLE (focused))
- gtk_editable_paste_clipboard (GTK_EDITABLE (focused));
- else
- browser_window_key_press(bw, NS_KEY_PASTE);
+/**
+ * menu signal handler for activation on copy item
+ */
+MENUHANDLER(copy, COPY_BUTTON);
- return TRUE;
-}
+/**
+ * menu signal handler for activation on paste item
+ */
+MENUHANDLER(paste, PASTE_BUTTON);
-MULTIHANDLER(delete)
-{
- return TRUE;
-}
+/**
+ * menu signal handler for activation on delete item
+ */
+MENUHANDLER(delete, DELETE_BUTTON);
static gboolean
@@ -890,22 +804,11 @@ nsgtk_on_customize_activate_menu(GtkMenuItem *widget, gpointer data)
return TRUE;
}
-MULTIHANDLER(selectall)
-{
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
-#if 0
- if (nsgtk_widget_has_focus(GTK_WIDGET(g->url_bar))) {
- NSLOG(netsurf, INFO, "Selecting all URL bar text");
- gtk_editable_select_region(GTK_EDITABLE(g->url_bar), 0, -1);
- } else {
-#endif
- NSLOG(netsurf, INFO, "Selecting all document text");
- browser_window_key_press(bw, NS_KEY_SELECT_ALL);
-#if 0
- }
-#endif
- return TRUE;
-}
+/**
+ * menu signal handler for activation on selectall item
+ */
+MENUHANDLER(selectall, SELECTALL_BUTTON);
+
MULTIHANDLER(find)
{
@@ -913,18 +816,11 @@ MULTIHANDLER(find)
return TRUE;
}
-MULTIHANDLER(preferences)
-{
- struct browser_window *bw = nsgtk_get_browser_window(g->top_level);
- GtkWidget* wndpreferences;
-
- wndpreferences = nsgtk_preferences(bw, g->window);
- if (wndpreferences != NULL) {
- gtk_widget_show(GTK_WIDGET(wndpreferences));
- }
+/**
+ * menu signal handler for activation on preferences item
+ */
+MENUHANDLER(preferences,PREFERENCES_BUTTON);
- return TRUE;
-}
MULTIHANDLER(zoomplus)
{
@@ -1973,6 +1869,27 @@ static struct gui_search_web_table search_web_table = {
struct gui_search_web_table *nsgtk_search_web_table = &search_web_table;
/* exported interface documented in gtk/scaffolding.h */
+nserror nsgtk_scaffolding_destroy_all(void)
+{
+ struct nsgtk_scaffolding *gs;
+
+ gs = scaf_list;
+ assert(gs != NULL);
+
+ if (nsgtk_check_for_downloads(gs->window) == true) {
+ return NSERROR_INVALID;
+ }
+
+ /* iterate all scaffolding windows and destroy them */
+ while (gs != NULL) {
+ gtk_widget_destroy(GTK_WIDGET(gs->window));
+ gs = gs->next;
+ }
+ return NSERROR_OK;
+}
+
+
+/* exported interface documented in gtk/scaffolding.h */
GtkWindow* nsgtk_scaffolding_window(struct nsgtk_scaffolding *g)
{
return g->window;
@@ -2242,8 +2159,10 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
/* connect main window signals to their handlers. */
- CONNECT(gs->window, "delete-event",
- scaffolding_window_delete_event, gs);
+ CONNECT(gs->window,
+ "delete-event",
+ scaffolding_window_delete_event,
+ gs);
CONNECT(gs->window, "destroy", scaffolding_window_destroy, gs);
diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h
index d5a916fe8..0f19a2418 100644
--- a/frontends/gtk/scaffolding.h
+++ b/frontends/gtk/scaffolding.h
@@ -56,6 +56,14 @@ struct gtk_search {
struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *gw);
/**
+ * causes all scaffolding windows to be destroyed.
+ *
+ * \return NSERROR_OK and all scaffolding windows destroyed else
+ * NSERROR_INVALID if download in progress and user continued.
+ */
+nserror nsgtk_scaffolding_destroy_all(void);
+
+/**
* 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 57cda1e76..1560a6ebe 100644
--- a/frontends/gtk/toolbar.c
+++ b/frontends/gtk/toolbar.c
@@ -41,6 +41,7 @@
#include "desktop/print.h"
#include "netsurf/content.h"
#include "netsurf/browser_window.h"
+#include "netsurf/keypress.h"
#include "gtk/toolbar_items.h"
#include "gtk/completion.h"
@@ -57,6 +58,7 @@
#include "gtk/tabs.h"
#include "gtk/print.h"
#include "gtk/layout_pango.h"
+#include "gtk/preferences.h"
#include "gtk/toolbar.h"
/**
@@ -2528,6 +2530,204 @@ print_button_clicked_cb(GtkWidget *widget, gpointer data)
return TRUE;
}
+/**
+ * handler for quit 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
+quit_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ nsgtk_scaffolding_destroy_all();
+ return TRUE;
+}
+
+
+/**
+ * handler for cut 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
+cut_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+ struct browser_window *bw;
+ GtkWidget *focused;
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+
+ focused = gtk_window_get_focus(GTK_WINDOW(toplevel));
+
+ /* let gtk handle it if focused widget is an editable */
+ if (GTK_IS_EDITABLE(focused)) {
+ gtk_editable_cut_clipboard(GTK_EDITABLE(focused));
+ } else {
+ bw = tb->get_bw(tb->get_bw_ctx);
+ browser_window_key_press(bw, NS_KEY_CUT_SELECTION);
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * handler for copy 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
+copy_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+ struct browser_window *bw;
+ GtkWidget *focused;
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+
+ focused = gtk_window_get_focus(GTK_WINDOW(toplevel));
+
+ /* let gtk handle it if focused widget is an editable */
+ if (GTK_IS_EDITABLE(focused)) {
+ gtk_editable_copy_clipboard(GTK_EDITABLE(focused));
+ } else {
+ bw = tb->get_bw(tb->get_bw_ctx);
+ browser_window_key_press(bw, NS_KEY_COPY_SELECTION);
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * handler for paste 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
+paste_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+ struct browser_window *bw;
+ GtkWidget *focused;
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+
+ focused = gtk_window_get_focus(GTK_WINDOW(toplevel));
+
+ /* let gtk handle it if focused widget is an editable */
+ if (GTK_IS_EDITABLE(focused)) {
+ gtk_editable_paste_clipboard(GTK_EDITABLE(focused));
+ } else {
+ bw = tb->get_bw(tb->get_bw_ctx);
+ browser_window_key_press(bw, NS_KEY_PASTE);
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * handler for delete 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
+delete_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+ struct browser_window *bw;
+ GtkWidget *focused;
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+
+ focused = gtk_window_get_focus(GTK_WINDOW(toplevel));
+
+ /* let gtk handle it if focused widget is an editable */
+ if (GTK_IS_EDITABLE(focused)) {
+ gtk_editable_delete_selection(GTK_EDITABLE(focused));
+ } else {
+ bw = tb->get_bw(tb->get_bw_ctx);
+ browser_window_key_press(bw, NS_KEY_CLEAR_SELECTION);
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * handler for select all 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
+selectall_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+ struct browser_window *bw;
+ GtkWidget *focused;
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+
+ focused = gtk_window_get_focus(GTK_WINDOW(toplevel));
+
+ /* let gtk handle it if focused widget is an editable */
+ if (GTK_IS_EDITABLE(focused)) {
+ gtk_editable_select_region(GTK_EDITABLE(focused), 0, -1);
+ } else {
+ bw = tb->get_bw(tb->get_bw_ctx);
+ browser_window_key_press(bw, NS_KEY_SELECT_ALL);
+ }
+
+ return TRUE;
+}
+
+
+/**
+ * handler for preferences 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
+preferences_button_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data;
+ struct browser_window *bw;
+ GtkWidget *toplevel;
+ GtkWidget *wndpreferences;
+
+ bw = tb->get_bw(tb->get_bw_ctx);
+
+ toplevel = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW);
+
+ wndpreferences = nsgtk_preferences(bw, GTK_WINDOW(toplevel));
+ if (wndpreferences != NULL) {
+ gtk_widget_show(wndpreferences);
+ }
+
+ return TRUE;
+
+}
+
/**
* create a toolbar item
diff --git a/frontends/gtk/toolbar_items.h b/frontends/gtk/toolbar_items.h
index 24afef980..b4bc91f45 100644
--- a/frontends/gtk/toolbar_items.h
+++ b/frontends/gtk/toolbar_items.h
@@ -109,14 +109,14 @@ 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, print_button_clicked_cb)
-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(QUIT_BUTTON, quit, true, quit_button_clicked_cb)
+TOOLBAR_ITEM(CUT_BUTTON, cut, true, cut_button_clicked_cb)
+TOOLBAR_ITEM(COPY_BUTTON, copy, true, copy_button_clicked_cb)
+TOOLBAR_ITEM(PASTE_BUTTON, paste, true, paste_button_clicked_cb)
+TOOLBAR_ITEM(DELETE_BUTTON, delete, false, delete_button_clicked_cb)
+TOOLBAR_ITEM(SELECTALL_BUTTON, selectall, true, selectall_button_clicked_cb)
TOOLBAR_ITEM(FIND_BUTTON, find, true, NULL)
-TOOLBAR_ITEM(PREFERENCES_BUTTON, preferences, true, NULL)
+TOOLBAR_ITEM(PREFERENCES_BUTTON, preferences, true, preferences_button_clicked_cb)
TOOLBAR_ITEM(ZOOMPLUS_BUTTON, zoomplus, true, NULL)
TOOLBAR_ITEM(ZOOMMINUS_BUTTON, zoomminus, true, NULL)
TOOLBAR_ITEM(ZOOMNORMAL_BUTTON, zoomnormal, true, NULL)