From 90bd61944e3e8c790803acfbade09369a9dcc141 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 29 Aug 2019 00:22:07 +0100 Subject: implemented another seven signal handlers --- frontends/gtk/scaffolding.c | 233 ++++++++++++++---------------------------- frontends/gtk/scaffolding.h | 8 ++ frontends/gtk/toolbar.c | 200 ++++++++++++++++++++++++++++++++++++ frontends/gtk/toolbar_items.h | 14 +-- 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 @@ -94,6 +94,19 @@ static gboolean nsgtk_on_##q##_activate(struct nsgtk_scaffolding *g) #define BUTTONHANDLER(q)\ 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 */ @@ -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) { @@ -1972,6 +1868,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) { @@ -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 @@ -55,6 +55,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. * 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) -- cgit v1.2.3