From 3fd74abb3c2969f170d727154245cde3ef8a4b87 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 11 May 2010 19:01:33 -0400 Subject: [PATCH] add cleanup function for menus that fires when the menu is no longer visible --- openbox/menu.c | 5 +++++ openbox/menu.h | 15 +++++++++++++++ openbox/menuframe.c | 8 ++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/openbox/menu.c b/openbox/menu.c index 5a5844b..1f9874a 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -654,6 +654,11 @@ void menu_set_execute_func(ObMenu *self, ObMenuExecuteFunc func) self->more_menu->execute_func = func; /* keep it in sync */ } +void menu_set_cleanup_func(ObMenu *self, ObMenuCleanupFunc func) +{ + self->cleanup_func = func; +} + void menu_set_destroy_func(ObMenu *self, ObMenuDestroyFunc func) { self->destroy_func = func; diff --git a/openbox/menu.h b/openbox/menu.h index 16cf429..c0cc199 100644 --- a/openbox/menu.h +++ b/openbox/menu.h @@ -43,6 +43,7 @@ typedef void (*ObMenuExecuteFunc)(struct _ObMenuEntry *entry, struct _ObMenuFrame *frame, struct _ObClient *client, guint state, gpointer data); +typedef void (*ObMenuCleanupFunc)(struct _ObMenu *menu, gpointer data); typedef void (*ObMenuDestroyFunc)(struct _ObMenu *menu, gpointer data); /*! @param x is the mouse x coordinate. on return it should be the x coordinate for the menu @@ -83,6 +84,7 @@ struct _ObMenu ObMenuHideFunc hide_func; ObMenuUpdateFunc update_func; ObMenuExecuteFunc execute_func; + ObMenuCleanupFunc cleanup_func; ObMenuDestroyFunc destroy_func; ObMenuPlaceFunc place_func; @@ -176,11 +178,24 @@ void menu_show(gchar *name, gint x, gint y, gboolean mouse, struct _ObClient *client); gboolean menu_hide_delay_reached(void); +/*! The show function is called right after a menu is shown */ void menu_set_show_func(ObMenu *menu, ObMenuShowFunc func); +/*! The hide function is called right before a menu is hidden */ void menu_set_hide_func(ObMenu *menu, ObMenuHideFunc func); +/*! The update function is called when the menu should refresh its + contents, generally right before it is shown */ void menu_set_update_func(ObMenu *menu, ObMenuUpdateFunc func); +/*! The execute function is called when a user chooses to execute an + entry in the menu */ void menu_set_execute_func(ObMenu *menu, ObMenuExecuteFunc func); +/*! The cleanup function is called after a menu is hidden, allowing it + to be cleaned up between uses */ +void menu_set_cleanup_func(ObMenu *menu, ObMenuCleanupFunc func); +/*! The destroy function is called when the menu is being destroyed + permanently */ void menu_set_destroy_func(ObMenu *menu, ObMenuDestroyFunc func); +/*! The place function is called when the menu is being shown and allows + the menu to choose its initial position */ void menu_set_place_func(ObMenu *menu, ObMenuPlaceFunc func); /* functions for building menus */ diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 9127257..91e7c53 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -1061,14 +1061,15 @@ gboolean menu_frame_show_submenu(ObMenuFrame *self, ObMenuFrame *parent, static void menu_frame_hide(ObMenuFrame *self) { + ObMenu *const menu = self->menu; GList *it = g_list_find(menu_frame_visible, self); gulong ignore_start; if (!it) return; - if (self->menu->hide_func) - self->menu->hide_func(self, self->menu->data); + if (menu->hide_func) + menu->hide_func(self, menu->data); if (self->child) menu_frame_hide(self->child); @@ -1095,6 +1096,9 @@ static void menu_frame_hide(ObMenuFrame *self) event_end_ignore_all_enters(ignore_start); menu_frame_free(self); + + if (menu->cleanup_func) + menu->cleanup_func(menu, menu->data); } void menu_frame_hide_all(void) -- 1.9.1