summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2019-10-10 18:04:32 +0100
committerVincent Sanders <vince@kyllikki.org>2019-10-10 18:04:32 +0100
commit8e986ae214fcf373d9d459b72b643ae62ffa054a (patch)
treebd7c413bad40f46ab772a20dc5fb254b1a007fa0
parentfed47dc35b2d6022e894cc4d387c515b0b391fd6 (diff)
downloadnetsurf-8e986ae214fcf373d9d459b72b643ae62ffa054a.tar.gz
netsurf-8e986ae214fcf373d9d459b72b643ae62ffa054a.tar.bz2
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.
-rw-r--r--frontends/gtk/menu.c75
-rw-r--r--frontends/gtk/menu.h55
-rw-r--r--frontends/gtk/scaffolding.c13
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)
{