Add hooks to support submenus on the fly.

SVN revision: 14272
This commit is contained in:
sebastid 2005-04-21 07:19:49 +00:00 committed by sebastid
parent e94cfff3ac
commit 0e445560db
2 changed files with 51 additions and 1 deletions

View File

@ -67,6 +67,8 @@ static int _e_menu_cb_mouse_wheel (void *data, int type, void *e
static int _e_menu_cb_scroll_timer (void *data);
static int _e_menu_cb_window_shape (void *data, int ev_type, void *ev);
static void _e_menu_item_submenu_post_cb_default(void *data, E_Menu *m, E_Menu_Item *mi);
/* local subsystem globals */
static Ecore_X_Window _e_menu_win = 0;
static Evas_List *_e_active_menus = NULL;
@ -500,6 +502,26 @@ e_menu_item_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m,
mi->cb.data = data;
}
void
e_menu_item_submenu_pre_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data)
{
E_OBJECT_CHECK(mi);
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
mi->submenu_pre_cb.func = func;
mi->submenu_pre_cb.data = data;
if (!mi->submenu_post_cb.func)
mi->submenu_post_cb.func = _e_menu_item_submenu_post_cb_default;
}
void
e_menu_item_submenu_post_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data)
{
E_OBJECT_CHECK(mi);
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
mi->submenu_post_cb.func = func;
mi->submenu_post_cb.data = data;
}
void
e_menu_item_active_set(E_Menu_Item *mi, int active)
{
@ -1436,6 +1458,8 @@ _e_menu_submenu_activate(E_Menu_Item *mi)
}
mi->menu->pending_new_submenu = 0;
_e_menu_deactivate_above(mi->menu);
if (mi->submenu_pre_cb.func)
mi->submenu_pre_cb.func(mi->submenu_pre_cb.data, mi->menu, mi);
if (mi->submenu)
{
E_Menu *m;
@ -1447,6 +1471,8 @@ _e_menu_submenu_activate(E_Menu_Item *mi)
_e_menu_reposition(m);
e_object_unref(E_OBJECT(m));
}
if (mi->submenu_post_cb.func)
mi->submenu_post_cb.func(mi->submenu_post_cb.data, mi->menu, mi);
}
static void
@ -2185,3 +2211,15 @@ _e_menu_cb_window_shape(void *data, int ev_type, void *ev)
}
return 1;
}
static void
_e_menu_item_submenu_post_cb_default(void *data, E_Menu *m, E_Menu_Item *mi)
{
E_Menu *subm;
if (!mi->submenu) return;
subm = mi->submenu;
e_menu_item_submenu_set(mi, NULL);
e_object_del(E_OBJECT(subm));
}

View File

@ -107,7 +107,17 @@ struct _E_Menu_Item
void *data;
void (*func) (void *data, E_Menu *m, E_Menu_Item *mi);
} cb;
struct {
void *data;
void (*func) (void *data, E_Menu *m, E_Menu_Item *mi);
} submenu_pre_cb;
struct {
void *data;
void (*func) (void *data, E_Menu *m, E_Menu_Item *mi);
} submenu_post_cb;
unsigned char separator : 1;
unsigned char radio : 1;
unsigned char check : 1;
@ -147,6 +157,8 @@ EAPI void e_menu_item_radio_group_set(E_Menu_Item *mi, int radg);
EAPI void e_menu_item_toggle_set(E_Menu_Item *mi, int tog);
EAPI int e_menu_item_toggle_get(E_Menu_Item *mi);
EAPI void e_menu_item_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_submenu_pre_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_submenu_post_callback_set(E_Menu_Item *mi, void (*func) (void *data, E_Menu *m, E_Menu_Item *mi), void *data);
EAPI void e_menu_item_active_set(E_Menu_Item *mi, int active);
EAPI void e_menu_idler_before(void);