From 8e986ae214fcf373d9d459b72b643ae62ffa054a Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 10 Oct 2019 18:04:32 +0100 Subject: ensure menu resources are released this ensures all the menu resources are freed when the containing window receives the destroy signal. Previously these resources were leaked. --- frontends/gtk/menu.c | 75 +++++++++++++++++++++++++++++++++++++++++++-- frontends/gtk/menu.h | 55 +++++++++++++++++++++++++++++++++ frontends/gtk/scaffolding.c | 13 ++++++-- 3 files changed, 138 insertions(+), 5 deletions(-) diff --git a/frontends/gtk/menu.c b/frontends/gtk/menu.c index 08af970f3..d0a984a99 100644 --- a/frontends/gtk/menu.c +++ b/frontends/gtk/menu.c @@ -263,8 +263,8 @@ nsgtk_menu_toolbars_submenu(GtkAccelGroup *group) * \param group the 'global' in a gtk sense accelerator reference */ -static struct nsgtk_developer_submenu *nsgtk_menu_developer_submenu( - GtkAccelGroup *group) +static struct nsgtk_developer_submenu * +nsgtk_menu_developer_submenu(GtkAccelGroup *group) { struct nsgtk_developer_submenu *dmenu = malloc(sizeof(struct nsgtk_developer_submenu)); @@ -423,7 +423,6 @@ static struct nsgtk_nav_menu *nsgtk_menu_nav_submenu(GtkAccelGroup *group) ADD_SEP(nav, ret); IMAGE_ITEM(nav, openlocation, gtkOpenLocation, ret, group); - return ret; } @@ -597,3 +596,73 @@ nsgtk_link_menu_create(GtkAccelGroup *group) return nmenu; } + + +/* exported function documented in gtk/menu.h */ +nserror nsgtk_menu_bar_destroy(struct nsgtk_bar_submenu *menu) +{ + gtk_widget_destroy(GTK_WIDGET(menu->bar_menu)); + + free(menu->file_submenu->export_submenu); + free(menu->file_submenu); + free(menu->edit_submenu); + free(menu->view_submenu->tabs_submenu); + free(menu->view_submenu->toolbars_submenu); + free(menu->view_submenu->scaleview_submenu); + free(menu->view_submenu); + free(menu->nav_submenu); + free(menu->tabs_submenu); + free(menu->tools_submenu->developer_submenu); + free(menu->tools_submenu); + free(menu->help_submenu); + free(menu); + + return NSERROR_OK; +} + +/* exported function documented in gtk/menu.h */ +nserror nsgtk_burger_menu_destroy(struct nsgtk_burger_menu *menu) +{ + gtk_widget_destroy(GTK_WIDGET(menu->burger_menu)); + + free(menu->file_submenu->export_submenu); + free(menu->file_submenu); + free(menu->edit_submenu); + free(menu->view_submenu->tabs_submenu); + free(menu->view_submenu->toolbars_submenu); + free(menu->view_submenu->scaleview_submenu); + free(menu->view_submenu); + free(menu->nav_submenu); + free(menu->tabs_submenu); + free(menu->tools_submenu->developer_submenu); + free(menu->tools_submenu); + free(menu->help_submenu); + free(menu); + + return NSERROR_OK; +} + + +/* exported function documented in gtk/menu.h */ +nserror nsgtk_popup_menu_destroy(struct nsgtk_popup_menu *menu) +{ + gtk_widget_destroy(GTK_WIDGET(menu->popup_menu)); + + free(menu->toolbars_submenu); + free(menu->tools_submenu->developer_submenu); + free(menu->tools_submenu); + free(menu); + + return NSERROR_OK; +} + + +/* exported function documented in gtk/menu.h */ +nserror nsgtk_link_menu_destroy(struct nsgtk_link_menu *menu) +{ + gtk_widget_destroy(GTK_WIDGET(menu->link_menu)); + + free(menu); + + return NSERROR_OK; +} diff --git a/frontends/gtk/menu.h b/frontends/gtk/menu.h index 822e463d2..a6f9ea456 100644 --- a/frontends/gtk/menu.h +++ b/frontends/gtk/menu.h @@ -210,27 +210,82 @@ struct nsgtk_link_menu { GtkWidget *copy_menuitem; }; + /** * Create main menubar menu. */ struct nsgtk_bar_submenu *nsgtk_menu_bar_create(GtkMenuShell *menubar, GtkAccelGroup *group); + /** * Generate burger menu. + * + * \param accelerator group to use with menu + * \return new menu structure or NULL on error */ struct nsgtk_burger_menu *nsgtk_burger_menu_create(GtkAccelGroup *group); + /** * Generate right click popup menu. * + * \param accelerator group to use with menu + * \return new menu structure or NULL on error */ struct nsgtk_popup_menu *nsgtk_popup_menu_create(GtkAccelGroup *group); + /** * Generate context sensitive link popup menu. * + * \param accelerator group to use with menu + * \return new menu structure or NULL on error */ struct nsgtk_link_menu *nsgtk_link_menu_create(GtkAccelGroup *group); +/** + * destroy bar menu + * + * destroys the gtk widgets associated with menu and frees all storage. + * + * \param menu menu to destroy + * \return NSERROR_OK and menu destroyed on success else error code + */ +nserror nsgtk_menu_bar_destroy(struct nsgtk_bar_submenu *menu); + + +/** + * destroy burger menu + * + * destroys the gtk widgets associated with menu and frees all storage. + * + * \param menu menu to destroy + * \return NSERROR_OK and menu destroyed on success else error code + */ +nserror nsgtk_burger_menu_destroy(struct nsgtk_burger_menu *menu); + + +/** + * destroy popup menu + * + * destroys the gtk widgets associated with menu and frees all storage. + * + * \param menu menu to destroy + * \return NSERROR_OK and menu destroyed on success else error code + */ +nserror nsgtk_popup_menu_destroy(struct nsgtk_popup_menu *menu); + + +/** + * destroy link menu + * + * destroys the gtk widgets associated with menu and frees all storage. + * + * \param menu menu to destroy + * \return NSERROR_OK and menu destroyed on success else error code + */ +nserror nsgtk_link_menu_destroy(struct nsgtk_link_menu *menu); + + #endif diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c index e4b4c6fff..001cb91fc 100644 --- a/frontends/gtk/scaffolding.c +++ b/frontends/gtk/scaffolding.c @@ -87,7 +87,7 @@ struct nsgtk_scaffolding { /** link popup menu */ struct nsgtk_link_menu *link_menu; - /** menu entries widgets for sensativity adjustment */ + /** menu entries widgets for sensitivity adjustment */ struct nsgtk_menu menus[PLACEHOLDER_BUTTON]; }; @@ -201,6 +201,14 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data) NSLOG(netsurf, INFO, "scaffold list head: %p", scaf_list); + /* ensure menu resources are freed */ + nsgtk_menu_bar_destroy(gs->menu_bar); + nsgtk_burger_menu_destroy(gs->burger_menu); + nsgtk_popup_menu_destroy(gs->popup_menu); + nsgtk_link_menu_destroy(gs->link_menu); + + free(gs); + if (scaf_list == NULL) { /* no more open windows - stop the browser */ nsgtk_complete = true; @@ -1008,7 +1016,7 @@ create_scaffolding_link_menu(struct nsgtk_scaffolding *g, GtkAccelGroup *group) */ static nserror nsgtk_menu_initialise(struct nsgtk_scaffolding *g) { -#define TOOLBAR_ITEM_p(identifier, name, iconame) \ +#define TOOLBAR_ITEM_p(identifier, name, iconame) \ g->menus[identifier].mhandler = nsgtk_on_##name##_activate_menu; \ g->menus[identifier].iconname = iconame; #define TOOLBAR_ITEM_y(identifier, name, iconame) \ @@ -1393,6 +1401,7 @@ nserror nsgtk_scaffolding_toolbar_context_menu(struct nsgtk_scaffolding *gs) return NSERROR_OK; } + /* exported interface documented in gtk/scaffolding.h */ nserror nsgtk_scaffolding_burger_menu(struct nsgtk_scaffolding *gs) { -- cgit v1.2.3