diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 8616ab4ca..9d09b55ab 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -362,6 +362,7 @@ e_border_shutdown(void) if (borders_hash) eina_hash_free(borders_hash); borders_hash = NULL; + e_int_border_menu_hooks_clear(); return 1; } diff --git a/src/bin/e_int_border_menu.c b/src/bin/e_int_border_menu.c index a6492d3cb..f00df664b 100644 --- a/src/bin/e_int_border_menu.c +++ b/src/bin/e_int_border_menu.c @@ -48,11 +48,55 @@ static void _e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item * static void _e_border_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_border_menu_cb_netwm_icon(void *data, E_Menu *m, E_Menu_Item *mi); +static Eina_List *menu_hooks = NULL; + +EAPI E_Border_Menu_Hook * +e_int_border_menu_hook_add(E_Border_Menu_Hook_Cb cb, const void *data) +{ + E_Border_Menu_Hook *h; + + if (!cb) return NULL; + h = E_NEW(E_Border_Menu_Hook, 1); + if (!h) return NULL; + + h->cb = cb; + h->data = (void*)data; + menu_hooks = eina_list_append(menu_hooks, h); + return h; +} + +EAPI void +e_int_border_menu_hook_del(E_Border_Menu_Hook *hook) +{ + E_Border_Menu_Hook *h; + Eina_List *l; + + if (!hook) return; + + EINA_LIST_FOREACH(menu_hooks, l, h) + if (h == hook) + { + menu_hooks = eina_list_remove_list(menu_hooks, l); + free(h); + return; + } +} + +EAPI void +e_int_border_menu_hooks_clear(void) +{ + E_Border_Menu_Hook *h; + EINA_LIST_FREE(menu_hooks, h) + free(h); +} + EAPI void e_int_border_menu_create(E_Border *bd) { E_Menu *m; E_Menu_Item *mi; + Eina_List *l; + E_Border_Menu_Hook *h; char buf[128]; if (bd->border_menu) return; @@ -152,6 +196,8 @@ e_int_border_menu_create(E_Border *bd) "e/widgets/border/default/close"), "e/widgets/border/default/close"); } + EINA_LIST_FOREACH(menu_hooks, l, h) + h->cb(bd, h->data); } EAPI void diff --git a/src/bin/e_int_border_menu.h b/src/bin/e_int_border_menu.h index 1d349d49a..51fc239a2 100644 --- a/src/bin/e_int_border_menu.h +++ b/src/bin/e_int_border_menu.h @@ -4,6 +4,16 @@ #ifndef E_INT_BORDER_MENU_H #define E_INT_BORDER_MENU_H +typedef void (*E_Border_Menu_Hook_Cb)(E_Border *, void *); +typedef struct E_Border_Menu_Hook +{ + E_Border_Menu_Hook_Cb cb; + void *data; +} E_Border_Menu_Hook; + +EAPI E_Border_Menu_Hook *e_int_border_menu_hook_add(E_Border_Menu_Hook_Cb cb, const void *data); +EAPI void e_int_border_menu_hook_del(E_Border_Menu_Hook *hook); +EAPI void e_int_border_menu_hooks_clear(void); EAPI void e_int_border_menu_create(E_Border *bd); EAPI void e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_X_Time timestamp); EAPI void e_int_border_menu_del(E_Border *bd);