2004-11-24 19:37:45 -08:00
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
/* TODO List:
|
2012-06-20 23:19:43 -07:00
|
|
|
*
|
2004-11-24 19:37:45 -08:00
|
|
|
* * support change of menu items after realize
|
|
|
|
* * support add/del of menu items after realize
|
|
|
|
* * support text/color classes
|
|
|
|
* * refcount menu up while looping thru and calling other fn's
|
|
|
|
* * support alignment (x, y) as well as spawn direction
|
|
|
|
* * need different menu style support for different menus
|
|
|
|
* * add menu icon/title support
|
|
|
|
* * use event timestamps not clock for "click and release" detect
|
|
|
|
* * menu icons can set if/how they will be scaled
|
|
|
|
* * support move/resize of "box" that spawned the menu
|
|
|
|
* * add image item (label is replaced by image/icon)
|
|
|
|
* * add generic evas object item type (label replaced by object)
|
|
|
|
* * allow menus to stretch width/height to fit spawner widget/box
|
|
|
|
* * allow menus to auto-shrink (horizontally) if forced to
|
|
|
|
* * support auto left/right direction spawn
|
2005-05-06 21:34:26 -07:00
|
|
|
* * support obscures to indicate offscreen/not visible menu parts
|
2004-11-24 19:37:45 -08:00
|
|
|
*/
|
|
|
|
|
2006-01-06 15:45:13 -08:00
|
|
|
/* local subsystem data types */
|
|
|
|
typedef struct _E_Menu_Category E_Menu_Category;
|
|
|
|
|
|
|
|
struct _E_Menu_Category
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
void *data;
|
2009-03-24 14:11:03 -07:00
|
|
|
Eina_List *callbacks;
|
2006-01-06 15:45:13 -08:00
|
|
|
};
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem functions */
|
2012-06-21 00:11:47 -07:00
|
|
|
static void _e_menu_free(E_Menu *m);
|
|
|
|
static void _e_menu_item_free(E_Menu_Item *mi);
|
|
|
|
static void _e_menu_item_realize(E_Menu_Item *mi);
|
|
|
|
static void _e_menu_realize(E_Menu *m);
|
|
|
|
static void _e_menu_items_layout_update(E_Menu *m);
|
|
|
|
static void _e_menu_item_unrealize(E_Menu_Item *mi);
|
|
|
|
static void _e_menu_unrealize(E_Menu *m);
|
|
|
|
static void _e_menu_activate_internal(E_Menu *m, E_Zone *zone);
|
|
|
|
static void _e_menu_deactivate_all(void);
|
|
|
|
static void _e_menu_deactivate_above(E_Menu *m);
|
|
|
|
static void _e_menu_submenu_activate(E_Menu_Item *mi);
|
|
|
|
static void _e_menu_submenu_deactivate(E_Menu_Item *mi);
|
|
|
|
static void _e_menu_reposition(E_Menu *m);
|
|
|
|
static int _e_menu_active_call(void);
|
|
|
|
static int _e_menu_realize_call(E_Menu_Item *mi);
|
|
|
|
static void _e_menu_item_activate_next(void);
|
|
|
|
static void _e_menu_item_activate_previous(void);
|
|
|
|
static void _e_menu_item_activate_first(void);
|
|
|
|
static void _e_menu_item_activate_last(void);
|
|
|
|
static void _e_menu_item_activate_nth(int n);
|
|
|
|
static void _e_menu_item_activate_char(const char *key_compose);
|
|
|
|
static void _e_menu_activate_next(void);
|
|
|
|
static void _e_menu_activate_previous(void);
|
|
|
|
static void _e_menu_activate_first(void);
|
|
|
|
static void _e_menu_activate_last(void);
|
2006-12-28 06:15:10 -08:00
|
|
|
#if 0
|
2012-06-21 00:11:47 -07:00
|
|
|
static void _e_menu_activate_nth(int n);
|
2006-12-28 06:15:10 -08:00
|
|
|
#endif
|
2012-06-21 00:11:47 -07:00
|
|
|
static E_Menu *_e_menu_active_get(void);
|
2009-10-25 11:42:47 -07:00
|
|
|
static E_Menu_Item *_e_menu_item_active_get(void);
|
2012-06-21 00:11:47 -07:00
|
|
|
static Eina_List *_e_menu_list_item_active_get(void);
|
|
|
|
static int _e_menu_outside_bounds_get(int xdir, int ydir);
|
|
|
|
static void _e_menu_scroll_by(int dx, int dy);
|
|
|
|
static void _e_menu_mouse_autoscroll_check(void);
|
|
|
|
static void _e_menu_item_ensure_onscreen(E_Menu_Item *mi);
|
|
|
|
static int _e_menu_auto_place(E_Menu *m, int x, int y, int w, int h);
|
|
|
|
static void _e_menu_cb_intercept_item_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
|
|
|
|
static void _e_menu_cb_intercept_item_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
|
|
|
|
static void _e_menu_cb_intercept_container_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
|
|
|
|
static void _e_menu_cb_intercept_container_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
|
|
|
|
static void _e_menu_cb_ecore_evas_resize(Ecore_Evas *ee);
|
|
|
|
static void _e_menu_cb_item_in(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
|
|
static void _e_menu_cb_item_out(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
|
|
static Eina_Bool _e_menu_cb_key_down(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _e_menu_cb_key_up(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _e_menu_cb_mouse_down(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _e_menu_cb_mouse_up(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _e_menu_cb_mouse_move(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _e_menu_cb_mouse_wheel(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _e_menu_cb_scroll_animator(void *data);
|
|
|
|
static Eina_Bool _e_menu_cb_window_shape(void *data, int ev_type, void *ev);
|
|
|
|
static void _e_menu_cb_item_submenu_post_default(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static Eina_Bool _e_menu_categories_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
|
2005-04-21 00:19:49 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem globals */
|
2009-10-25 11:42:47 -07:00
|
|
|
static Ecore_X_Window _e_menu_win = 0;
|
|
|
|
static Eina_List *_e_active_menus = NULL;
|
2010-01-14 20:41:20 -08:00
|
|
|
static Eina_Hash *_e_menu_hash = NULL;
|
2009-10-25 11:42:47 -07:00
|
|
|
static E_Menu_Item *_e_active_menu_item = NULL;
|
2012-08-30 00:04:53 -07:00
|
|
|
static E_Menu_Item *_e_prev_active_menu_item = NULL;
|
2008-12-17 07:33:43 -08:00
|
|
|
/*static Eina_Hash *_e_menu_category_items = NULL;*/
|
2009-10-25 11:42:47 -07:00
|
|
|
static Eina_Hash *_e_menu_categories = NULL;
|
|
|
|
static Ecore_X_Time _e_menu_activate_time = 0;
|
|
|
|
static int _e_menu_activate_floating = 0;
|
|
|
|
static int _e_menu_activate_maybe_drag = 0;
|
|
|
|
static int _e_menu_activate_dragging = 0;
|
|
|
|
static Ecore_Animator *_e_menu_scroll_animator = NULL;
|
|
|
|
static double _e_menu_scroll_start = 0.0;
|
|
|
|
static int _e_menu_x = 0;
|
|
|
|
static int _e_menu_y = 0;
|
|
|
|
static Ecore_X_Time _e_menu_time = 0;
|
|
|
|
static int _e_menu_autoscroll_x = 0;
|
|
|
|
static int _e_menu_autoscroll_y = 0;
|
|
|
|
static Ecore_Event_Handler *_e_menu_key_down_handler = NULL;
|
|
|
|
static Ecore_Event_Handler *_e_menu_key_up_handler = NULL;
|
|
|
|
static Ecore_Event_Handler *_e_menu_mouse_down_handler = NULL;
|
|
|
|
static Ecore_Event_Handler *_e_menu_mouse_up_handler = NULL;
|
|
|
|
static Ecore_Event_Handler *_e_menu_mouse_move_handler = NULL;
|
|
|
|
static Ecore_Event_Handler *_e_menu_mouse_wheel_handler = NULL;
|
2005-04-13 08:52:34 -07:00
|
|
|
static Ecore_Event_Handler *_e_menu_window_shape_handler = NULL;
|
2012-09-11 04:55:08 -07:00
|
|
|
static Eina_Bool _e_menu_lock = EINA_FALSE;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2009-03-23 05:28:15 -07:00
|
|
|
static Eina_List *
|
|
|
|
_e_active_menus_copy_ref(void)
|
|
|
|
{
|
|
|
|
E_Object *o;
|
|
|
|
Eina_List *l, *ret = NULL;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, o)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
ret = eina_list_append(ret, o);
|
|
|
|
e_object_ref(o);
|
2009-03-23 05:28:15 -07:00
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_List *
|
|
|
|
_e_menu_list_free_unref(Eina_List *l)
|
|
|
|
{
|
|
|
|
E_Object *o;
|
2012-08-30 00:04:53 -07:00
|
|
|
Eina_List *ll, *lll;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2012-08-30 00:04:53 -07:00
|
|
|
/* list must be freed in reverse to ensure that submenus
|
|
|
|
* (which are added to the end of the list)
|
|
|
|
* are deleted before their parents
|
|
|
|
*/
|
|
|
|
EINA_LIST_REVERSE_FOREACH_SAFE(l, ll, lll, o)
|
|
|
|
{
|
|
|
|
e_object_unref(o);
|
|
|
|
l = eina_list_remove_list(l, ll);
|
|
|
|
}
|
2009-03-23 05:28:15 -07:00
|
|
|
return l;
|
|
|
|
}
|
|
|
|
|
2012-08-30 00:04:53 -07:00
|
|
|
/* macros for debugging menu refcounts */
|
|
|
|
#if 0
|
|
|
|
#define e_object_ref(X) do {\
|
|
|
|
int xx; \
|
|
|
|
xx = e_object_ref(X); \
|
|
|
|
INF("REF: %p || %d", X, xx); \
|
|
|
|
} while (0)
|
|
|
|
#define e_object_unref(X) do {\
|
|
|
|
int xx; \
|
|
|
|
xx = e_object_unref(X); \
|
|
|
|
INF("UNREF: %p || %d", X, xx); \
|
|
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* externally accessible functions */
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_init(void)
|
|
|
|
{
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_key_down_handler =
|
2009-10-25 11:42:47 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _e_menu_cb_key_down, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_key_up_handler =
|
2009-10-25 11:42:47 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_KEY_UP, _e_menu_cb_key_up, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_mouse_down_handler =
|
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_cb_mouse_down, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_mouse_up_handler =
|
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_cb_mouse_up, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_mouse_move_handler =
|
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_cb_mouse_move, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_mouse_wheel_handler =
|
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_cb_mouse_wheel, NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
_e_menu_window_shape_handler =
|
|
|
|
ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE,
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_cb_window_shape, NULL);
|
2008-12-17 07:33:43 -08:00
|
|
|
_e_menu_categories = eina_hash_string_superfast_new(NULL);
|
2010-01-14 20:41:20 -08:00
|
|
|
|
|
|
|
if (!_e_menu_hash) _e_menu_hash = eina_hash_string_superfast_new(NULL);
|
2012-09-20 01:57:36 -07:00
|
|
|
e_int_menus_init();
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_shutdown(void)
|
|
|
|
{
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Menu *m;
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_key_down_handler);
|
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_key_up_handler);
|
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_down_handler);
|
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_up_handler);
|
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_move_handler);
|
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_mouse_wheel_handler);
|
2005-04-13 08:52:34 -07:00
|
|
|
E_FN_DEL(ecore_event_handler_del, _e_menu_window_shape_handler);
|
2005-02-15 03:49:24 -08:00
|
|
|
|
2011-02-15 21:20:13 -08:00
|
|
|
if (!x_fatal)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2011-02-15 21:20:13 -08:00
|
|
|
EINA_LIST_FREE(_e_active_menus, m)
|
|
|
|
{
|
|
|
|
m->active = 0;
|
|
|
|
_e_menu_unrealize(m);
|
|
|
|
m->in_active_list = 0;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-02-15 03:49:24 -08:00
|
|
|
_e_active_menus = NULL;
|
2006-01-06 15:45:13 -08:00
|
|
|
if (_e_menu_categories)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
eina_hash_foreach(_e_menu_categories, _e_menu_categories_free_cb, NULL);
|
|
|
|
eina_hash_free(_e_menu_categories);
|
|
|
|
_e_menu_categories = NULL;
|
2006-01-06 15:45:13 -08:00
|
|
|
}
|
2008-12-17 07:33:43 -08:00
|
|
|
|
2010-05-01 12:28:27 -07:00
|
|
|
if (_e_menu_hash)
|
|
|
|
{
|
|
|
|
eina_hash_free(_e_menu_hash);
|
|
|
|
_e_menu_hash = NULL;
|
|
|
|
}
|
2012-09-11 04:55:08 -07:00
|
|
|
_e_menu_lock = EINA_FALSE;
|
2012-09-19 03:15:03 -07:00
|
|
|
e_int_menus_shutdown();
|
2010-05-01 12:28:27 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2012-12-30 23:47:51 -08:00
|
|
|
EAPI void
|
|
|
|
e_menu_hide_all(void)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
|
|
|
|
EINA_LIST_FREE(_e_active_menus, m)
|
|
|
|
{
|
|
|
|
m->active = 0;
|
|
|
|
_e_menu_unrealize(m);
|
|
|
|
m->in_active_list = 0;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Menu *
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_new(void)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2005-01-21 22:58:34 -08:00
|
|
|
m = E_OBJECT_ALLOC(E_Menu, E_MENU_TYPE, _e_menu_free);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!m) return NULL;
|
|
|
|
m->cur.w = 1;
|
|
|
|
m->cur.h = 1;
|
2006-01-06 15:45:13 -08:00
|
|
|
m->category = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
return m;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-11 05:43:01 -08:00
|
|
|
e_menu_activate_key(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2005-01-11 05:43:01 -08:00
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-07-25 02:55:47 -07:00
|
|
|
_e_menu_activate_time = 0;
|
2005-06-16 02:12:44 -07:00
|
|
|
_e_menu_activate_floating = 0;
|
2005-01-11 05:43:01 -08:00
|
|
|
_e_menu_activate_internal(m, zone);
|
2006-10-07 23:43:31 -07:00
|
|
|
if (!m->zone)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_deactivate(m);
|
|
|
|
return;
|
2006-10-07 23:43:31 -07:00
|
|
|
}
|
2005-05-18 03:18:02 -07:00
|
|
|
switch (dir)
|
|
|
|
{
|
|
|
|
case E_MENU_POP_DIRECTION_LEFT:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x - m->cur.w;
|
|
|
|
m->cur.y = y;
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_RIGHT:
|
2012-06-21 00:11:47 -07:00
|
|
|
m->cur.x = x + w;
|
|
|
|
m->cur.y = y;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_UP:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x;
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
m->cur.y = y - m->cur.h;
|
|
|
|
_e_menu_activate_last();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_DOWN:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x;
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
m->cur.y = y + h;
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_AUTO:
|
2012-06-21 00:11:47 -07:00
|
|
|
{
|
|
|
|
int pos = 0;
|
|
|
|
|
|
|
|
pos = _e_menu_auto_place(m, x, y, w, h);
|
|
|
|
if (pos == 4)
|
|
|
|
_e_menu_activate_last();
|
|
|
|
else
|
|
|
|
_e_menu_activate_first();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
default:
|
2012-06-21 00:11:47 -07:00
|
|
|
m->cur.x = x + w;
|
|
|
|
m->cur.y = y + h;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
2005-05-18 03:18:02 -07:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-07-25 02:55:47 -07:00
|
|
|
e_menu_activate_mouse(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir, Ecore_X_Time activate_time)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_Menu_Item *pmi;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2005-01-11 05:43:01 -08:00
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-07-25 02:55:47 -07:00
|
|
|
_e_menu_activate_time = activate_time;
|
2005-06-16 02:12:44 -07:00
|
|
|
_e_menu_activate_floating = 0;
|
2005-01-11 05:43:01 -08:00
|
|
|
_e_menu_activate_internal(m, zone);
|
2006-10-07 23:43:31 -07:00
|
|
|
if (!m->zone)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_deactivate(m);
|
|
|
|
return;
|
2006-10-07 23:43:31 -07:00
|
|
|
}
|
2005-05-18 03:18:02 -07:00
|
|
|
switch (dir)
|
|
|
|
{
|
|
|
|
case E_MENU_POP_DIRECTION_LEFT:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x - m->cur.w;
|
|
|
|
m->cur.y = y;
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_RIGHT:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x + w;
|
|
|
|
m->cur.y = y;
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_UP:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x;
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
m->cur.y = y - m->cur.h;
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_DOWN:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x;
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
m->cur.y = y + h;
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_AUTO:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_auto_place(m, x, y, w, h);
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
default:
|
2012-06-21 00:11:47 -07:00
|
|
|
m->cur.x = x + w;
|
|
|
|
m->cur.y = y + h;
|
|
|
|
break;
|
2005-05-18 03:18:02 -07:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
pmi = _e_menu_item_active_get();
|
|
|
|
if (pmi) e_menu_item_active_set(pmi, 0);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-01-11 05:43:01 -08:00
|
|
|
e_menu_activate(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_Menu_Item *pmi;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2005-01-11 05:43:01 -08:00
|
|
|
E_OBJECT_CHECK(zone);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(zone, E_ZONE_TYPE);
|
2005-07-25 02:55:47 -07:00
|
|
|
_e_menu_activate_time = 0;
|
2005-06-16 02:12:44 -07:00
|
|
|
_e_menu_activate_floating = 0;
|
2005-01-11 05:43:01 -08:00
|
|
|
_e_menu_activate_internal(m, zone);
|
2006-10-07 23:43:31 -07:00
|
|
|
if (!m->zone)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_deactivate(m);
|
|
|
|
return;
|
2006-10-07 23:43:31 -07:00
|
|
|
}
|
2005-05-18 03:18:02 -07:00
|
|
|
switch (dir)
|
|
|
|
{
|
|
|
|
case E_MENU_POP_DIRECTION_LEFT:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x - m->cur.w;
|
|
|
|
m->cur.y = y;
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_RIGHT:
|
2009-03-24 13:13:50 -07:00
|
|
|
_e_menu_realize(m);
|
2012-06-21 00:11:47 -07:00
|
|
|
m->cur.x = x + w;
|
|
|
|
m->cur.y = y;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_UP:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x;
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
m->cur.y = y - m->cur.h;
|
|
|
|
_e_menu_activate_last();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_DOWN:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
m->cur.x = x;
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
m->cur.y = y + h;
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
_e_menu_activate_first();
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
case E_MENU_POP_DIRECTION_AUTO:
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_auto_place(m, x, y, w, h);
|
|
|
|
break;
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
default:
|
2012-06-21 00:11:47 -07:00
|
|
|
m->cur.x = x + w;
|
|
|
|
m->cur.y = y + h;
|
|
|
|
break;
|
2005-05-18 03:18:02 -07:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
pmi = _e_menu_item_active_get();
|
|
|
|
if (pmi) e_menu_item_active_set(pmi, 0);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_deactivate(E_Menu *m)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
m->cur.visible = 0;
|
|
|
|
m->active = 0;
|
|
|
|
if (m->post_deactivate_cb.func)
|
|
|
|
m->post_deactivate_cb.func(m->post_deactivate_cb.data, m);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_freeze(E_Menu *m)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(m, 0);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(m, E_MENU_TYPE, 0);
|
2004-11-24 19:37:45 -08:00
|
|
|
m->frozen++;
|
|
|
|
return m->frozen;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_thaw(E_Menu *m)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(m, 0);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(m, E_MENU_TYPE, 0);
|
2004-11-24 19:37:45 -08:00
|
|
|
m->frozen--;
|
|
|
|
if (m->frozen < 0) m->frozen = 0;
|
|
|
|
return m->frozen;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-22 06:02:08 -07:00
|
|
|
e_menu_title_set(E_Menu *m, const char *title)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((m->header.title) && (title) && (!strcmp(m->header.title, title)))
|
|
|
|
return;
|
|
|
|
if (m->header.title)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
eina_stringshare_del(m->header.title);
|
|
|
|
m->header.title = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2008-10-15 08:12:56 -07:00
|
|
|
if (title) m->header.title = eina_stringshare_add(title);
|
2004-11-24 19:37:45 -08:00
|
|
|
else m->header.title = NULL;
|
|
|
|
m->changed = 1;
|
2012-07-31 02:11:23 -07:00
|
|
|
edje_object_part_text_set(m->bg_object, "e.text.title", m->header.title);
|
|
|
|
if (m->header.title)
|
|
|
|
edje_object_signal_emit(m->bg_object, "e,action,show,title", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(m->bg_object, "e,action,hide,title", "e");
|
|
|
|
edje_object_message_signal_process(m->bg_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-22 06:02:08 -07:00
|
|
|
e_menu_icon_file_set(E_Menu *m __UNUSED__, const char *icon __UNUSED__)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2010-08-19 17:45:45 -07:00
|
|
|
/* FIXME: support menu icons
|
2012-06-21 00:11:47 -07:00
|
|
|
E_OBJECT_CHECK(m);
|
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2010-08-19 17:45:45 -07:00
|
|
|
*/
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-22 06:02:08 -07:00
|
|
|
e_menu_category_set(E_Menu *m, const char *category)
|
2006-01-06 15:45:13 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(m);
|
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
|
|
|
if (m->category)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
eina_stringshare_del(m->category);
|
|
|
|
m->category = NULL;
|
2006-01-06 15:45:13 -08:00
|
|
|
}
|
2006-01-08 08:38:01 -08:00
|
|
|
if (category)
|
2009-03-24 14:11:03 -07:00
|
|
|
m->category = eina_stringshare_add(category);
|
2006-01-08 08:38:01 -08:00
|
|
|
else
|
2009-03-24 14:11:03 -07:00
|
|
|
m->category = NULL;
|
2006-01-06 15:45:13 -08:00
|
|
|
m->changed = 1;
|
|
|
|
}
|
2006-01-07 02:39:46 -08:00
|
|
|
|
|
|
|
EAPI void
|
2006-01-06 15:45:13 -08:00
|
|
|
e_menu_category_data_set(char *category, void *data)
|
|
|
|
{
|
|
|
|
E_Menu_Category *cat;
|
2008-12-17 07:33:43 -08:00
|
|
|
|
|
|
|
cat = eina_hash_find(_e_menu_categories, category);
|
2006-01-06 15:45:13 -08:00
|
|
|
if (cat)
|
2009-03-24 14:11:03 -07:00
|
|
|
cat->data = data;
|
2010-09-08 16:59:07 -07:00
|
|
|
else /* if it isn't found create the new hash */
|
2006-01-06 15:45:13 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
cat = calloc(1, sizeof(E_Menu_Category));
|
|
|
|
cat->data = data;
|
|
|
|
eina_hash_add(_e_menu_categories, category, cat);
|
2006-01-06 15:45:13 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-08 08:38:01 -08:00
|
|
|
EAPI E_Menu_Category_Callback *
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_category_callback_add(char *category, void (*create_cb)(E_Menu *m, void *category_data, void *data), void (*free_cb)(void *data), void *data)
|
2006-01-06 15:45:13 -08:00
|
|
|
{
|
|
|
|
E_Menu_Category *cat;
|
2006-01-08 08:38:01 -08:00
|
|
|
E_Menu_Category_Callback *cb = NULL;
|
2008-12-17 07:33:43 -08:00
|
|
|
|
|
|
|
cat = eina_hash_find(_e_menu_categories, category);
|
2010-09-08 16:59:07 -07:00
|
|
|
if (!cat) /* if it isn't found create the new hash */
|
2006-01-06 15:45:13 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
cat = calloc(1, sizeof(E_Menu_Category));
|
|
|
|
eina_hash_add(_e_menu_categories, category, cat);
|
2006-01-06 15:45:13 -08:00
|
|
|
}
|
2006-01-08 08:38:01 -08:00
|
|
|
if (cat)
|
2009-03-24 14:11:03 -07:00
|
|
|
{
|
|
|
|
cb = calloc(1, sizeof(E_Menu_Category_Callback));
|
|
|
|
if (cb)
|
|
|
|
{
|
|
|
|
cb->data = data;
|
2012-05-03 19:34:56 -07:00
|
|
|
cb->create = create_cb;
|
|
|
|
cb->free = free_cb;
|
2009-03-24 14:11:03 -07:00
|
|
|
cb->category = eina_stringshare_add(category);
|
|
|
|
cat->callbacks = eina_list_append(cat->callbacks, cb);
|
|
|
|
}
|
|
|
|
}
|
2006-01-08 08:38:01 -08:00
|
|
|
return cb;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_menu_category_callback_del(E_Menu_Category_Callback *cb)
|
|
|
|
{
|
|
|
|
E_Menu_Category *cat;
|
|
|
|
|
|
|
|
if (cb)
|
2009-03-24 14:11:03 -07:00
|
|
|
{
|
|
|
|
cat = eina_hash_find(_e_menu_categories, cb->category);
|
|
|
|
if (cat)
|
|
|
|
cat->callbacks = eina_list_remove(cat->callbacks, cb);
|
|
|
|
eina_stringshare_del(cb->category);
|
|
|
|
free(cb);
|
|
|
|
}
|
2006-01-06 15:45:13 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_pre_activate_callback_set(E_Menu *m, void (*func)(void *data, E_Menu *m), void *data)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
m->pre_activate_cb.func = func;
|
|
|
|
m->pre_activate_cb.data = data;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_post_deactivate_callback_set(E_Menu *m, void (*func)(void *data, E_Menu *m), void *data)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(m);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(m, E_MENU_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
m->post_deactivate_cb.func = func;
|
|
|
|
m->post_deactivate_cb.data = data;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Menu *
|
2004-12-22 02:41:03 -08:00
|
|
|
e_menu_root_get(E_Menu *m)
|
|
|
|
{
|
|
|
|
E_Menu *ret;
|
|
|
|
|
|
|
|
E_OBJECT_CHECK_RETURN(m, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(m, E_MENU_TYPE, NULL);
|
2004-12-22 02:41:03 -08:00
|
|
|
ret = m;
|
2006-08-09 06:52:52 -07:00
|
|
|
while ((ret->parent_item) && (ret->parent_item->menu))
|
2009-03-24 14:11:03 -07:00
|
|
|
ret = ret->parent_item->menu;
|
2004-12-22 02:41:03 -08:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Menu_Item *
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_new(E_Menu *m)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
E_OBJECT_CHECK_RETURN(m, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(m, E_MENU_TYPE, NULL);
|
|
|
|
mi = E_OBJECT_ALLOC(E_Menu_Item, E_MENU_ITEM_TYPE, _e_menu_item_free);
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->menu = m;
|
2008-10-22 04:49:33 -07:00
|
|
|
mi->menu->items = eina_list_append(mi->menu->items, mi);
|
|
|
|
mi->list_position = eina_list_last(mi->menu->items);
|
2004-11-24 19:37:45 -08:00
|
|
|
return mi;
|
|
|
|
}
|
|
|
|
|
2011-03-17 10:08:36 -07:00
|
|
|
EAPI E_Menu_Item *
|
|
|
|
e_menu_item_new_relative(E_Menu *m, E_Menu_Item *rel)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
|
|
|
E_OBJECT_CHECK_RETURN(m, NULL);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(m, E_MENU_TYPE, NULL);
|
|
|
|
if (rel)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
E_OBJECT_CHECK_RETURN(rel, NULL);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(rel, E_MENU_ITEM_TYPE, NULL);
|
|
|
|
if (rel->menu != m) return NULL;
|
2011-03-17 10:08:36 -07:00
|
|
|
}
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2011-03-17 10:08:36 -07:00
|
|
|
mi = E_OBJECT_ALLOC(E_Menu_Item, E_MENU_ITEM_TYPE, _e_menu_item_free);
|
|
|
|
mi->menu = m;
|
|
|
|
|
|
|
|
if (rel)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
Eina_List *l;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
l = eina_list_data_find_list(m->items, rel);
|
|
|
|
m->items = eina_list_append_relative_list(m->items, mi, l);
|
2012-07-30 06:30:08 -07:00
|
|
|
mi->list_position = l->next;
|
2011-03-17 10:08:36 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
m->items = eina_list_prepend(m->items, mi);
|
|
|
|
mi->list_position = m->items;
|
2011-03-17 10:08:36 -07:00
|
|
|
}
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2011-03-17 10:08:36 -07:00
|
|
|
return mi;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Menu_Item *
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_nth(E_Menu *m, int n)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(m, NULL);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(m, E_MENU_TYPE, NULL);
|
2008-10-22 04:49:33 -07:00
|
|
|
return (E_Menu_Item *)eina_list_nth(m->items, n);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2009-03-23 05:28:15 -07:00
|
|
|
e_menu_item_num_get(const E_Menu_Item *mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-23 05:28:15 -07:00
|
|
|
const Eina_List *l;
|
|
|
|
const E_Menu_Item *mi2;
|
2009-03-24 14:11:03 -07:00
|
|
|
int i = 0;
|
2009-03-23 05:28:15 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
E_OBJECT_CHECK_RETURN(mi, -1);
|
2006-06-08 12:01:32 -07:00
|
|
|
E_OBJECT_CHECK_RETURN(mi->menu, -1);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(mi, E_MENU_TYPE, -1);
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(mi->menu->items, l, mi2)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi2 == mi) return i;
|
|
|
|
i++;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-19 20:09:44 -07:00
|
|
|
e_menu_item_icon_file_set(E_Menu_Item *mi, const char *icon)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (((mi->icon) && (icon) && (!strcmp(icon, mi->icon))) ||
|
2012-06-20 23:19:43 -07:00
|
|
|
((!mi->icon) && (!icon)))
|
2004-11-24 19:37:45 -08:00
|
|
|
return;
|
2008-10-15 08:12:56 -07:00
|
|
|
if (mi->icon) eina_stringshare_del(mi->icon);
|
|
|
|
if (mi->icon_key) eina_stringshare_del(mi->icon_key);
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->icon = NULL;
|
|
|
|
mi->icon_key = NULL;
|
2011-01-15 17:11:46 -08:00
|
|
|
if (icon)
|
|
|
|
{
|
|
|
|
mi->icon = eina_stringshare_add(icon);
|
2012-09-19 00:16:54 -07:00
|
|
|
if (eina_str_has_extension(mi->icon, ".edj"))
|
2011-01-15 17:11:46 -08:00
|
|
|
mi->icon_key = eina_stringshare_add("icon");
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-19 20:09:44 -07:00
|
|
|
e_menu_item_icon_edje_set(E_Menu_Item *mi, const char *icon, const char *key)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (((mi->icon) && (icon) && (!strcmp(icon, mi->icon))) ||
|
2012-06-20 23:19:43 -07:00
|
|
|
((!mi->icon) && (!icon)) ||
|
2004-11-24 19:37:45 -08:00
|
|
|
((key) && (mi->icon_key) && (!strcmp(key, mi->icon_key))))
|
|
|
|
return;
|
2012-09-19 00:20:26 -07:00
|
|
|
eina_stringshare_replace(&mi->icon, icon);
|
|
|
|
eina_stringshare_replace(&mi->icon_key, key);
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-05-19 20:09:44 -07:00
|
|
|
e_menu_item_label_set(E_Menu_Item *mi, const char *label)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (((mi->label) && (label) && (!strcmp(label, mi->label))) ||
|
2012-06-20 23:19:43 -07:00
|
|
|
((!mi->label) && (!label)))
|
2004-11-24 19:37:45 -08:00
|
|
|
return;
|
2008-10-15 08:12:56 -07:00
|
|
|
if (mi->label) eina_stringshare_del(mi->label);
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->label = NULL;
|
2008-10-15 08:12:56 -07:00
|
|
|
if (label) mi->label = eina_stringshare_add(label);
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_submenu_set(E_Menu_Item *mi, E_Menu *sub)
|
|
|
|
{
|
2012-08-03 02:11:15 -07:00
|
|
|
Eina_Bool submenu = EINA_FALSE;
|
|
|
|
Evas_Object *o;
|
|
|
|
int ww, hh;
|
2004-11-24 19:37:45 -08:00
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2012-08-03 02:11:15 -07:00
|
|
|
submenu = !!mi->submenu;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->submenu) e_object_unref(E_OBJECT(mi->submenu));
|
2005-04-27 16:29:12 -07:00
|
|
|
if (sub) e_object_ref(E_OBJECT(sub));
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->submenu = sub;
|
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
2012-08-03 02:11:15 -07:00
|
|
|
if (!!sub == submenu) return;
|
|
|
|
if (!mi->bg_object) return;
|
2012-09-11 04:55:08 -07:00
|
|
|
if (sub) e_object_ref(E_OBJECT(sub));
|
|
|
|
_e_menu_lock = EINA_TRUE;
|
2012-08-03 02:11:15 -07:00
|
|
|
if ((mi->submenu) || (mi->submenu_pre_cb.func))
|
|
|
|
{
|
2012-11-02 04:56:32 -07:00
|
|
|
if (mi->submenu_object)
|
|
|
|
{
|
|
|
|
if (!e_util_strcmp(evas_object_type_get(mi->submenu_object), "edje"))
|
|
|
|
{
|
|
|
|
/* already have a correct submenu object, don't re-set it */
|
|
|
|
_e_menu_lock = EINA_FALSE;
|
|
|
|
if (sub) e_object_unref(E_OBJECT(sub));
|
2012-12-11 06:37:17 -08:00
|
|
|
edje_object_size_min_calc(mi->submenu_object, &ww, &hh);
|
|
|
|
mi->submenu_w = ww;
|
|
|
|
mi->submenu_h = hh;
|
|
|
|
e_box_pack_options_set(mi->submenu_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-11-02 04:56:32 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
evas_object_del(mi->submenu_object);
|
|
|
|
}
|
2012-08-03 02:11:15 -07:00
|
|
|
o = edje_object_add(mi->menu->evas);
|
2012-09-11 04:55:08 -07:00
|
|
|
if (sub && (mi->submenu != sub)) e_object_ref(E_OBJECT(sub));
|
|
|
|
mi->submenu = sub;
|
2012-08-03 02:11:15 -07:00
|
|
|
mi->submenu_object = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/submenu");
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
edje_object_size_min_calc(mi->submenu_object, &ww, &hh);
|
|
|
|
mi->submenu_w = ww;
|
|
|
|
mi->submenu_h = hh;
|
2012-12-11 06:37:17 -08:00
|
|
|
e_box_pack_options_set(mi->submenu_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-11-02 04:56:32 -07:00
|
|
|
edje_object_part_swallow(mi->bg_object, "e.swallow.content",
|
|
|
|
mi->container_object);
|
|
|
|
edje_object_size_min_calc(mi->bg_object, &ww, &hh);
|
|
|
|
e_box_pack_options_set(mi->bg_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
1, 0, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-08-03 02:11:15 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (mi->submenu_object) evas_object_del(mi->submenu_object);
|
|
|
|
o = evas_object_rectangle_add(mi->menu->evas);
|
|
|
|
mi->submenu_object = o;
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
}
|
2012-09-11 04:55:08 -07:00
|
|
|
_e_menu_lock = EINA_FALSE;
|
|
|
|
if (sub) e_object_unref(E_OBJECT(sub));
|
2012-08-03 02:11:15 -07:00
|
|
|
if ((mi->submenu) || (mi->submenu_pre_cb.func))
|
|
|
|
{
|
|
|
|
if (e_theme_edje_object_set(mi->bg_object, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/submenu_bg"))
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
e_theme_edje_object_set(mi->bg_object, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/item_bg");
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_separator_set(E_Menu_Item *mi, int sep)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2009-03-24 14:11:03 -07:00
|
|
|
if (((mi->separator) && (sep)) || ((!mi->separator) && (!sep))) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->separator = sep;
|
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_check_set(E_Menu_Item *mi, int chk)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2009-03-24 14:11:03 -07:00
|
|
|
if (((mi->check) && (chk)) || ((!mi->check) && (!chk))) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->check = chk;
|
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_radio_set(E_Menu_Item *mi, int rad)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2009-03-24 14:11:03 -07:00
|
|
|
if (((mi->radio) && (rad)) || ((!mi->radio) && (!rad))) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->radio = rad;
|
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_radio_group_set(E_Menu_Item *mi, int radg)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-12-22 22:38:27 -08:00
|
|
|
if (mi->radio_group == radg) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->radio_group = radg;
|
|
|
|
mi->changed = 1;
|
|
|
|
mi->menu->changed = 1;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_toggle_set(E_Menu_Item *mi, int tog)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->separator) return;
|
|
|
|
if (tog)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
mi->toggle = 1;
|
|
|
|
if (mi->bg_object)
|
|
|
|
edje_object_signal_emit(mi->bg_object, "e,state,on", "e");
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
edje_object_signal_emit(mi->icon_bg_object, "e,state,on", "e");
|
|
|
|
if (mi->label_object)
|
|
|
|
edje_object_signal_emit(mi->label_object, "e,state,on", "e");
|
|
|
|
if (mi->submenu_object)
|
|
|
|
edje_object_signal_emit(mi->submenu_object, "e,state,on", "e");
|
|
|
|
if (mi->toggle_object)
|
|
|
|
edje_object_signal_emit(mi->toggle_object, "e,state,on", "e");
|
|
|
|
if (mi->menu->bg_object)
|
|
|
|
edje_object_signal_emit(mi->menu->bg_object, "e,state,on", "e");
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
mi->toggle = 0;
|
|
|
|
if (mi->bg_object)
|
|
|
|
edje_object_signal_emit(mi->bg_object, "e,state,off", "e");
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
edje_object_signal_emit(mi->icon_bg_object, "e,state,off", "e");
|
|
|
|
if (mi->label_object)
|
|
|
|
edje_object_signal_emit(mi->label_object, "e,state,off", "e");
|
|
|
|
if (mi->submenu_object)
|
|
|
|
edje_object_signal_emit(mi->submenu_object, "e,state,off", "e");
|
|
|
|
if (mi->toggle_object)
|
|
|
|
edje_object_signal_emit(mi->toggle_object, "e,state,off", "e");
|
|
|
|
if (mi->menu->bg_object)
|
|
|
|
edje_object_signal_emit(mi->menu->bg_object, "e,state,off", "e");
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (tog)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->radio)
|
|
|
|
{
|
|
|
|
const Eina_List *l;
|
|
|
|
E_Menu_Item *mi2;
|
2009-03-23 05:28:15 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
EINA_LIST_FOREACH(mi->menu->items, l, mi2)
|
|
|
|
{
|
|
|
|
if ((mi2 != mi) && (mi2->radio) &&
|
|
|
|
(mi2->radio_group == mi->radio_group))
|
|
|
|
e_menu_item_toggle_set(mi2, 0);
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI int
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_toggle_get(E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK_RETURN(mi, 0);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(mi, E_MENU_ITEM_TYPE, 0);
|
2004-11-24 19:37:45 -08:00
|
|
|
return mi->toggle;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-07-30 04:55:43 -07:00
|
|
|
e_menu_item_callback_set(E_Menu_Item *mi, void (*func)(void *data, E_Menu *m, E_Menu_Item *mi), const void *data)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
mi->cb.func = func;
|
2012-07-30 04:55:43 -07:00
|
|
|
mi->cb.data = (void*)data;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2006-08-21 13:03:09 -07:00
|
|
|
EAPI void
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_item_realize_callback_set(E_Menu_Item *mi, void (*func)(void *data, E_Menu *m, E_Menu_Item *mi), void *data)
|
2006-08-21 13:03:09 -07:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
|
|
|
mi->realize_cb.func = func;
|
|
|
|
mi->realize_cb.data = data;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-28 03:54:58 -07:00
|
|
|
e_menu_item_submenu_pre_callback_set(E_Menu_Item *mi, void (*func)(void *data, E_Menu *m, E_Menu_Item *mi), const void *data)
|
2005-04-21 00:19:49 -07:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
|
|
|
mi->submenu_pre_cb.func = func;
|
2012-08-28 03:54:58 -07:00
|
|
|
mi->submenu_pre_cb.data = (void*)data;
|
2005-04-21 00:19:49 -07:00
|
|
|
if (!mi->submenu_post_cb.func)
|
2005-05-06 21:34:26 -07:00
|
|
|
mi->submenu_post_cb.func = _e_menu_cb_item_submenu_post_default;
|
2005-04-21 00:19:49 -07:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2012-08-28 03:54:58 -07:00
|
|
|
e_menu_item_submenu_post_callback_set(E_Menu_Item *mi, void (*func)(void *data, E_Menu *m, E_Menu_Item *mi), const void *data)
|
2005-04-21 00:19:49 -07:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
|
|
|
mi->submenu_post_cb.func = func;
|
2012-08-28 03:54:58 -07:00
|
|
|
mi->submenu_post_cb.data = (void*)data;
|
2005-04-21 00:19:49 -07:00
|
|
|
}
|
|
|
|
|
2006-08-22 01:38:24 -07:00
|
|
|
EAPI void
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_item_drag_callback_set(E_Menu_Item *mi, void (*func)(void *data, E_Menu *m, E_Menu_Item *mi), void *data)
|
2006-08-22 01:38:24 -07:00
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
|
|
|
mi->drag_cb.func = func;
|
|
|
|
mi->drag_cb.data = data;
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_active_set(E_Menu_Item *mi, int active)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
2005-01-21 22:58:34 -08:00
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->separator) return;
|
2006-08-09 06:52:52 -07:00
|
|
|
if ((active) && (!mi->active))
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
E_Menu_Item *pmi;
|
|
|
|
|
|
|
|
if (mi->disable) return;
|
|
|
|
pmi = _e_menu_item_active_get();
|
|
|
|
if (mi == pmi) return;
|
2012-08-30 00:04:53 -07:00
|
|
|
if (pmi)
|
|
|
|
e_menu_item_active_set(pmi, 0);
|
|
|
|
if (_e_prev_active_menu_item && (mi != _e_prev_active_menu_item))
|
|
|
|
{
|
|
|
|
if (_e_prev_active_menu_item != mi->menu->parent_item)
|
|
|
|
_e_menu_submenu_deactivate(_e_prev_active_menu_item);
|
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
mi->active = 1;
|
|
|
|
_e_active_menu_item = mi;
|
|
|
|
if (mi->bg_object)
|
|
|
|
edje_object_signal_emit(mi->bg_object, "e,state,selected", "e");
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
edje_object_signal_emit(mi->icon_bg_object, "e,state,selected", "e");
|
|
|
|
if (mi->label_object)
|
|
|
|
edje_object_signal_emit(mi->label_object, "e,state,selected", "e");
|
|
|
|
if (mi->submenu_object)
|
|
|
|
edje_object_signal_emit(mi->submenu_object, "e,state,selected", "e");
|
|
|
|
if (mi->toggle_object)
|
|
|
|
edje_object_signal_emit(mi->toggle_object, "e,state,selected", "e");
|
|
|
|
if (mi->icon_key)
|
|
|
|
{
|
2010-06-20 04:13:31 -07:00
|
|
|
if (mi->icon_object)
|
|
|
|
{
|
|
|
|
if (strcmp(evas_object_type_get(mi->icon_object), "e_icon"))
|
|
|
|
edje_object_signal_emit(mi->icon_object, "e,state,selected", "e");
|
|
|
|
else
|
|
|
|
e_icon_selected_set(mi->icon_object, EINA_TRUE);
|
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
edje_object_signal_emit(mi->menu->bg_object, "e,state,selected", "e");
|
|
|
|
_e_menu_submenu_activate(mi);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2006-08-09 06:52:52 -07:00
|
|
|
else if ((!active) && (mi->active))
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
mi->active = 0;
|
2012-08-30 00:04:53 -07:00
|
|
|
_e_prev_active_menu_item = mi;
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_active_menu_item = NULL;
|
|
|
|
if (mi->bg_object)
|
|
|
|
edje_object_signal_emit(mi->bg_object, "e,state,unselected", "e");
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
edje_object_signal_emit(mi->icon_bg_object, "e,state,unselected", "e");
|
|
|
|
if (mi->label_object)
|
|
|
|
edje_object_signal_emit(mi->label_object, "e,state,unselected", "e");
|
|
|
|
if (mi->submenu_object)
|
|
|
|
edje_object_signal_emit(mi->submenu_object, "e,state,unselected", "e");
|
|
|
|
if (mi->toggle_object)
|
|
|
|
edje_object_signal_emit(mi->toggle_object, "e,state,unselected", "e");
|
|
|
|
if (mi->icon_key)
|
|
|
|
{
|
2010-06-20 04:13:31 -07:00
|
|
|
if (mi->icon_object)
|
|
|
|
{
|
|
|
|
if (strcmp(evas_object_type_get(mi->icon_object), "e_icon"))
|
|
|
|
edje_object_signal_emit(mi->icon_object, "e,state,unselected", "e");
|
|
|
|
else
|
|
|
|
e_icon_selected_set(mi->icon_object, EINA_FALSE);
|
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
edje_object_signal_emit(mi->menu->bg_object, "e,state,unselected", "e");
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-03 23:17:38 -07:00
|
|
|
EAPI E_Menu_Item *
|
|
|
|
e_menu_item_active_get(void)
|
|
|
|
{
|
|
|
|
return _e_active_menu_item;
|
|
|
|
}
|
|
|
|
|
2012-09-04 00:01:09 -07:00
|
|
|
EAPI void
|
|
|
|
e_menu_active_item_activate(void)
|
|
|
|
{
|
|
|
|
_e_menu_active_call();
|
|
|
|
_e_menu_deactivate_all();
|
|
|
|
}
|
|
|
|
|
2009-03-30 06:59:56 -07:00
|
|
|
EAPI void
|
|
|
|
e_menu_item_disabled_set(E_Menu_Item *mi, int disable)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(mi);
|
|
|
|
E_OBJECT_TYPE_CHECK(mi, E_MENU_ITEM_TYPE);
|
|
|
|
if (mi->separator) return;
|
|
|
|
if ((disable))
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->active) e_menu_item_active_set(mi, 0);
|
|
|
|
mi->disable = 1;
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
edje_object_signal_emit(mi->icon_bg_object, "e,state,disable", "e");
|
|
|
|
if (mi->label_object)
|
|
|
|
edje_object_signal_emit(mi->label_object, "e,state,disable", "e");
|
|
|
|
if (mi->toggle_object)
|
|
|
|
edje_object_signal_emit(mi->toggle_object, "e,state,disable", "e");
|
2009-03-30 06:59:56 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
mi->disable = 0;
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
edje_object_signal_emit(mi->icon_bg_object, "e,state,enable", "e");
|
|
|
|
if (mi->label_object)
|
|
|
|
edje_object_signal_emit(mi->label_object, "e,state,enable", "e");
|
|
|
|
if (mi->toggle_object)
|
|
|
|
edje_object_signal_emit(mi->toggle_object, "e,state,enable", "e");
|
2009-03-30 06:59:56 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_idler_before(void)
|
|
|
|
{
|
|
|
|
/* when e goes "idle" this gets called so leave all our hard work till */
|
|
|
|
/* idle time to avoid falling behind the user. just evaluate the high */
|
|
|
|
/* level state machine */
|
2009-03-23 05:28:15 -07:00
|
|
|
Eina_List *l, *removals = NULL, *tmp;
|
|
|
|
E_Menu *m;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
/* add refcount to all menus we will work with */
|
2009-03-23 05:28:15 -07:00
|
|
|
tmp = _e_active_menus_copy_ref();
|
2004-11-24 19:37:45 -08:00
|
|
|
/* phase 1. hide all the menus that want to be hidden */
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if ((!m->cur.visible) && (m->prev.visible))
|
|
|
|
{
|
|
|
|
m->prev.visible = m->cur.visible;
|
|
|
|
ecore_evas_hide(m->ecore_evas);
|
|
|
|
e_container_shape_hide(m->shape);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
/* phase 2. move & reisze all the menus that want to moves/resized */
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-08-06 01:16:14 -07:00
|
|
|
if (m->frozen) continue;
|
2012-06-21 00:11:47 -07:00
|
|
|
if (!m->realized) _e_menu_realize(m);
|
|
|
|
if (m->realized)
|
|
|
|
{
|
|
|
|
if (((m->cur.w) != (m->prev.w)) ||
|
|
|
|
((m->cur.h) != (m->prev.h)))
|
|
|
|
{
|
2012-08-07 23:15:49 -07:00
|
|
|
int w, h;
|
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
m->prev.w = m->cur.w;
|
|
|
|
m->prev.h = m->cur.h;
|
2012-08-07 23:15:49 -07:00
|
|
|
w = m->cur.w;
|
|
|
|
h = m->cur.h;
|
|
|
|
ecore_evas_resize(m->ecore_evas, w, h);
|
|
|
|
e_container_shape_resize(m->shape, w, h);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
if (((m->cur.x) != (m->prev.x)) ||
|
|
|
|
((m->cur.y) != (m->prev.y)))
|
|
|
|
{
|
2012-11-16 14:09:48 -08:00
|
|
|
if (!m->parent_item)
|
|
|
|
{
|
|
|
|
int x, y, w, h;
|
|
|
|
|
|
|
|
e_zone_useful_geometry_get(m->zone, &x, &y, &w, &h);
|
2012-12-27 19:28:25 -08:00
|
|
|
if (m->cur.w <= w)
|
|
|
|
{
|
|
|
|
if ((m->cur.x + m->cur.w) > (x + w))
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
}
|
|
|
|
if (m->cur.h <= h)
|
|
|
|
{
|
|
|
|
if ((m->cur.y + m->cur.h) > (y + h))
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
}
|
2012-11-16 14:09:48 -08:00
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
m->prev.x = m->cur.x;
|
|
|
|
m->prev.y = m->cur.y;
|
|
|
|
ecore_evas_move(m->ecore_evas, m->cur.x, m->cur.y);
|
|
|
|
e_container_shape_move(m->shape, m->cur.x, m->cur.y);
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
/* phase 3. show all the menus that want to be shown */
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-08-06 01:16:14 -07:00
|
|
|
if (m->frozen) continue;
|
2012-09-19 03:05:41 -07:00
|
|
|
if (!m->realized) continue;
|
2012-06-21 00:11:47 -07:00
|
|
|
if ((m->cur.visible) && (!m->prev.visible))
|
|
|
|
{
|
|
|
|
m->prev.visible = m->cur.visible;
|
|
|
|
ecore_evas_raise(m->ecore_evas);
|
|
|
|
ecore_evas_show(m->ecore_evas);
|
|
|
|
if (!m->shaped) e_container_shape_show(m->shape);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
/* phase 4. de-activate... */
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (!m->active)
|
|
|
|
{
|
|
|
|
_e_menu_unrealize(m);
|
|
|
|
removals = eina_list_append(removals, m);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FREE(removals, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (m->in_active_list)
|
|
|
|
{
|
|
|
|
_e_active_menus = eina_list_remove(_e_active_menus, m);
|
|
|
|
m->in_active_list = 0;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-04-13 08:52:34 -07:00
|
|
|
/* phase 5. shapes... */
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2005-04-13 08:52:34 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (m->need_shape_export)
|
|
|
|
{
|
|
|
|
Ecore_X_Rectangle *rects, *orects;
|
|
|
|
int num = 0;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
rects = ecore_x_window_shape_rectangles_get(m->evas_win, &num);
|
|
|
|
if (rects)
|
|
|
|
{
|
2009-03-24 14:11:03 -07:00
|
|
|
int changed = 1;
|
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
if ((num == m->shape_rects_num) && (m->shape_rects))
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
orects = m->shape_rects;
|
|
|
|
for (i = 0; i < num; i++)
|
|
|
|
{
|
|
|
|
if ((orects[i].x != rects[i].x) ||
|
|
|
|
(orects[i].y != rects[i].y) ||
|
|
|
|
(orects[i].width != rects[i].width) ||
|
|
|
|
(orects[i].height != rects[i].height))
|
|
|
|
{
|
|
|
|
changed = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// TODO: This is meaningless
|
|
|
|
changed = 0;
|
|
|
|
}
|
|
|
|
if (changed)
|
|
|
|
{
|
|
|
|
E_FREE(m->shape_rects);
|
|
|
|
m->shape_rects = rects;
|
|
|
|
m->shape_rects_num = num;
|
|
|
|
e_container_shape_rects_set(m->shape, rects, num);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
free(rects);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-09-05 08:24:07 -07:00
|
|
|
E_FREE(m->shape_rects);
|
2012-06-21 00:11:47 -07:00
|
|
|
m->shape_rects = NULL;
|
|
|
|
m->shape_rects_num = 0;
|
|
|
|
e_container_shape_rects_set(m->shape, NULL, 0);
|
|
|
|
}
|
|
|
|
m->need_shape_export = 0;
|
|
|
|
if (m->cur.visible) e_container_shape_show(m->shape);
|
|
|
|
}
|
2005-04-13 08:52:34 -07:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
/* del refcount to all menus we worked with */
|
2010-01-15 03:29:50 -08:00
|
|
|
_e_menu_list_free_unref(tmp);
|
2009-03-23 05:28:15 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!_e_active_menus)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (_e_menu_win)
|
|
|
|
{
|
|
|
|
ecore_x_window_free(_e_menu_win);
|
|
|
|
e_grabinput_release(_e_menu_win, _e_menu_win);
|
|
|
|
_e_menu_win = 0;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI Ecore_X_Window
|
2005-01-01 18:39:44 -08:00
|
|
|
e_menu_grab_window_get(void)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
return _e_menu_win;
|
2005-01-01 18:39:44 -08:00
|
|
|
}
|
|
|
|
|
2010-01-14 20:41:20 -08:00
|
|
|
EAPI E_Menu *
|
|
|
|
e_menu_find_by_window(Ecore_X_Window win)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2010-01-14 20:41:20 -08:00
|
|
|
m = eina_hash_find(_e_menu_hash, e_util_winid_str_get(win));
|
|
|
|
if ((m) && (m->evas_win != win))
|
|
|
|
return NULL;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* local subsystem functions */
|
|
|
|
static void
|
|
|
|
_e_menu_free(E_Menu *m)
|
|
|
|
{
|
2009-03-23 05:28:15 -07:00
|
|
|
Eina_List *l, *l_next;
|
|
|
|
E_Menu_Item *mi;
|
2008-12-29 04:40:49 -08:00
|
|
|
E_Menu_Category *cat = NULL;
|
2008-12-17 07:33:43 -08:00
|
|
|
|
2006-01-06 15:45:13 -08:00
|
|
|
/* the foreign menu items */
|
2008-12-29 04:40:49 -08:00
|
|
|
if (m->category) cat = eina_hash_find(_e_menu_categories, m->category);
|
2006-08-09 06:52:52 -07:00
|
|
|
if (cat)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
E_Menu_Category_Callback *cb;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
EINA_LIST_FOREACH(cat->callbacks, l, cb)
|
|
|
|
{
|
|
|
|
if (cb->free) cb->free(cb->data);
|
|
|
|
}
|
2006-08-09 06:52:52 -07:00
|
|
|
}
|
2012-08-30 00:04:53 -07:00
|
|
|
if (m->parent_item && (m->parent_item->submenu == m))
|
|
|
|
m->parent_item->submenu = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_unrealize(m);
|
2005-09-05 08:24:07 -07:00
|
|
|
E_FREE(m->shape_rects);
|
2005-06-27 03:08:53 -07:00
|
|
|
m->shape_rects_num = 0;
|
2012-06-21 00:11:47 -07:00
|
|
|
EINA_LIST_FOREACH_SAFE (m->items, l, l_next, mi)
|
2009-10-25 11:42:47 -07:00
|
|
|
e_object_del(E_OBJECT(mi));
|
2004-11-24 19:37:45 -08:00
|
|
|
if (m->in_active_list)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_active_menus = eina_list_remove(_e_active_menus, m);
|
|
|
|
m->in_active_list = 0;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2008-10-15 08:12:56 -07:00
|
|
|
if (m->header.title) eina_stringshare_del(m->header.title);
|
|
|
|
if (m->header.icon_file) eina_stringshare_del(m->header.icon_file);
|
2004-11-24 19:37:45 -08:00
|
|
|
free(m);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_free(E_Menu_Item *mi)
|
|
|
|
{
|
2006-08-09 06:52:52 -07:00
|
|
|
if (mi == _e_active_menu_item) _e_active_menu_item = NULL;
|
2012-08-30 00:04:53 -07:00
|
|
|
if (mi == _e_prev_active_menu_item) _e_prev_active_menu_item = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->submenu)
|
|
|
|
{
|
2012-08-30 00:04:53 -07:00
|
|
|
int ref = 0;
|
|
|
|
|
|
|
|
/* parent_item gets unset in a few places, reapply it for use in cleanup */
|
|
|
|
if (!mi->submenu->parent_item)
|
|
|
|
mi->submenu->parent_item = mi;
|
|
|
|
/* menu may not have been deactivated, ensure deactivate callback is called */
|
|
|
|
if (mi->active)
|
|
|
|
_e_menu_submenu_deactivate(mi);
|
|
|
|
/* submenus CANNOT exist without their parent menu+item, so ensure that they get deleted */
|
|
|
|
if (mi->submenu)
|
|
|
|
{
|
|
|
|
ref = e_object_ref_get(E_OBJECT(mi->submenu)) - 1;
|
|
|
|
e_object_unref(E_OBJECT(mi->submenu));
|
|
|
|
}
|
|
|
|
if (ref)
|
|
|
|
WRN("DANGLING SUBMENU FOR %s: REF(%d)||MENU(%p)", mi->label, ref, mi->submenu);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (mi->menu->realized) _e_menu_item_unrealize(mi);
|
2008-10-22 04:49:33 -07:00
|
|
|
mi->menu->items = eina_list_remove(mi->menu->items, mi);
|
2008-10-15 08:12:56 -07:00
|
|
|
if (mi->icon) eina_stringshare_del(mi->icon);
|
|
|
|
if (mi->icon_key) eina_stringshare_del(mi->icon_key);
|
|
|
|
if (mi->label) eina_stringshare_del(mi->label);
|
2004-11-24 19:37:45 -08:00
|
|
|
free(mi);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_cb_intercept_item_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
mi = data;
|
|
|
|
mi->x = x;
|
|
|
|
mi->y = y;
|
|
|
|
evas_object_move(mi->event_object, x, y);
|
|
|
|
evas_object_move(o, x, y);
|
|
|
|
if ((mi->submenu) && (mi->submenu->parent_item))
|
|
|
|
_e_menu_reposition(mi->submenu);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_cb_intercept_item_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
mi = data;
|
|
|
|
mi->w = w;
|
|
|
|
mi->h = h;
|
|
|
|
evas_object_resize(mi->event_object, w, h);
|
|
|
|
evas_object_resize(o, w, h);
|
|
|
|
if ((mi->submenu) && (mi->submenu->parent_item))
|
|
|
|
_e_menu_reposition(mi->submenu);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_cb_intercept_container_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
m = data;
|
|
|
|
m->container_x = x;
|
|
|
|
m->container_y = y;
|
|
|
|
if (m->parent_item) _e_menu_reposition(m);
|
|
|
|
evas_object_move(o, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_cb_intercept_container_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
2009-03-24 14:11:03 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
m = data;
|
|
|
|
m->container_w = w;
|
|
|
|
m->container_h = h;
|
|
|
|
if (m->parent_item) _e_menu_reposition(m);
|
|
|
|
evas_object_resize(o, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_realize(E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
|
|
|
Evas_Coord ww, hh;
|
|
|
|
|
2012-06-20 23:19:43 -07:00
|
|
|
/* and set up initial item state */
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->separator)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
mi->separator_object = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/separator");
|
|
|
|
evas_object_show(o);
|
|
|
|
edje_object_size_min_calc(mi->separator_object, &ww, &hh);
|
|
|
|
mi->separator_w = ww;
|
|
|
|
mi->separator_h = hh;
|
|
|
|
e_box_pack_end(mi->menu->container_object, mi->separator_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
mi->bg_object = o;
|
|
|
|
evas_object_intercept_move_callback_add(o, _e_menu_cb_intercept_item_move, mi);
|
|
|
|
evas_object_intercept_resize_callback_add(o, _e_menu_cb_intercept_item_resize, mi);
|
|
|
|
|
|
|
|
if ((mi->submenu) || (mi->submenu_pre_cb.func))
|
|
|
|
{
|
|
|
|
if (!e_theme_edje_object_set(mi->bg_object, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/submenu_bg"))
|
|
|
|
goto no_submenu_item;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
no_submenu_item:
|
|
|
|
e_theme_edje_object_set(mi->bg_object, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/item_bg");
|
|
|
|
}
|
|
|
|
evas_object_show(o);
|
|
|
|
|
|
|
|
o = e_box_add(mi->menu->evas);
|
|
|
|
e_box_homogenous_set(o, 0);
|
|
|
|
mi->container_object = o;
|
|
|
|
e_box_orientation_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
|
|
|
|
e_box_freeze(mi->container_object);
|
|
|
|
|
|
|
|
if (mi->check)
|
|
|
|
{
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
mi->toggle_object = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/check");
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
edje_object_size_min_calc(mi->toggle_object, &ww, &hh);
|
|
|
|
mi->toggle_w = ww;
|
|
|
|
mi->toggle_h = hh;
|
2012-12-12 03:06:40 -08:00
|
|
|
e_box_pack_options_set(mi->toggle_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
else if (mi->radio)
|
|
|
|
{
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
mi->toggle_object = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/radio");
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
edje_object_size_min_calc(mi->toggle_object, &ww, &hh);
|
|
|
|
mi->toggle_w = ww;
|
|
|
|
mi->toggle_h = hh;
|
2012-12-12 03:06:40 -08:00
|
|
|
e_box_pack_options_set(mi->toggle_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
o = evas_object_rectangle_add(mi->menu->evas);
|
|
|
|
mi->toggle_object = o;
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
}
|
|
|
|
if ((mi->icon) || (mi->realize_cb.func))
|
|
|
|
{
|
|
|
|
int icon_w = 0, icon_h = 0;
|
|
|
|
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
if (e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/icon"))
|
|
|
|
{
|
|
|
|
mi->icon_bg_object = o;
|
|
|
|
evas_object_show(o);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_del(o);
|
|
|
|
o = NULL;
|
|
|
|
}
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2006-09-03 04:32:13 -07:00
|
|
|
/* FIXME: Not sure why there are two different tries to get the icon size, surely only the last one si needed. */
|
|
|
|
/* FIXME: Do it this way later, when e_app_icon_add() just registers a request for an icon to be filled in when it's ready.
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->app)
|
|
|
|
{
|
|
|
|
o = e_app_icon_add(mi->menu->evas, mi->app);
|
|
|
|
mi->icon_object = o;
|
|
|
|
e_icon_size_get(mi->icon_object, &icon_w, &icon_h);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*/
|
|
|
|
if (mi->icon)
|
|
|
|
{
|
|
|
|
/* This is done this way to match up with how e_app_icon_add does it. */
|
|
|
|
if (mi->icon_key)
|
|
|
|
{
|
|
|
|
Evas_Coord iww, ihh;
|
|
|
|
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
if (edje_object_file_set(o, mi->icon, mi->icon_key))
|
|
|
|
{
|
|
|
|
mi->icon_object = o;
|
|
|
|
edje_object_size_max_get(o, &iww, &ihh);
|
|
|
|
icon_w = iww;
|
|
|
|
icon_h = ihh;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_del(o);
|
|
|
|
o = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!mi->icon_object)
|
|
|
|
{
|
|
|
|
o = e_icon_add(mi->menu->evas);
|
|
|
|
mi->icon_object = o;
|
|
|
|
e_icon_scale_size_set(o, e_util_icon_size_normalize(24 * e_scale));
|
2009-10-25 11:42:47 -07:00
|
|
|
e_icon_preload_set(mi->icon_object, 1);
|
2012-06-21 00:11:47 -07:00
|
|
|
e_icon_file_set(o, mi->icon);
|
|
|
|
e_icon_fill_inside_set(mi->icon_object, 1);
|
|
|
|
e_icon_size_get(mi->icon_object, &icon_w, &icon_h);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (_e_menu_realize_call(mi))
|
|
|
|
{
|
|
|
|
o = mi->icon_object;
|
|
|
|
e_icon_fill_inside_set(o, 1);
|
|
|
|
e_icon_size_get(o, &icon_w, &icon_h);
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
|
|
|
|
if (mi->icon_bg_object)
|
|
|
|
{
|
2012-11-14 02:35:38 -08:00
|
|
|
edje_extern_object_min_size_set(mi->icon_object, 0, 0);
|
2012-06-21 00:11:47 -07:00
|
|
|
edje_object_part_swallow(mi->icon_bg_object,
|
2012-06-20 23:19:43 -07:00
|
|
|
"e.swallow.content",
|
2009-03-24 14:11:03 -07:00
|
|
|
mi->icon_object);
|
2012-06-21 00:11:47 -07:00
|
|
|
edje_object_size_min_calc(mi->icon_bg_object, &ww, &hh);
|
|
|
|
mi->icon_w = ww;
|
|
|
|
mi->icon_h = hh;
|
|
|
|
e_box_pack_end(mi->container_object, mi->icon_bg_object);
|
2012-12-12 03:06:40 -08:00
|
|
|
e_box_pack_options_set(mi->icon_bg_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
e_icon_size_get(mi->icon_object, &icon_w, &icon_h);
|
|
|
|
mi->icon_w = icon_w;
|
|
|
|
mi->icon_h = icon_h;
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
2012-12-12 03:06:40 -08:00
|
|
|
e_box_pack_options_set(mi->icon_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
o = evas_object_rectangle_add(mi->menu->evas);
|
|
|
|
mi->icon_object = o;
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mi->label)
|
|
|
|
{
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
mi->label_object = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/label");
|
|
|
|
/* default label */
|
|
|
|
edje_object_part_text_set(o, "e.text.label", mi->label);
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
edje_object_size_min_calc(mi->label_object, &ww, &hh);
|
|
|
|
mi->label_w = ww;
|
|
|
|
mi->label_h = hh;
|
2012-12-12 03:06:40 -08:00
|
|
|
e_box_pack_options_set(mi->label_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
1, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
o = evas_object_rectangle_add(mi->menu->evas);
|
|
|
|
mi->label_object = o;
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
}
|
|
|
|
if ((mi->submenu) || (mi->submenu_pre_cb.func))
|
|
|
|
{
|
|
|
|
o = edje_object_add(mi->menu->evas);
|
|
|
|
mi->submenu_object = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/menus",
|
|
|
|
"e/widgets/menu/default/submenu");
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
evas_object_show(o);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
edje_object_size_min_calc(mi->submenu_object, &ww, &hh);
|
|
|
|
mi->submenu_w = ww;
|
|
|
|
mi->submenu_h = hh;
|
2012-12-12 03:06:40 -08:00
|
|
|
e_box_pack_options_set(mi->submenu_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
ww, hh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
o = evas_object_rectangle_add(mi->menu->evas);
|
|
|
|
mi->submenu_object = o;
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
|
|
|
evas_object_pass_events_set(o, 1);
|
|
|
|
e_box_pack_end(mi->container_object, o);
|
|
|
|
}
|
|
|
|
|
|
|
|
edje_object_part_swallow(mi->bg_object, "e.swallow.content",
|
2009-03-24 14:11:03 -07:00
|
|
|
mi->container_object);
|
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
o = evas_object_rectangle_add(mi->menu->evas);
|
|
|
|
evas_object_color_set(o, 0, 0, 0, 0);
|
|
|
|
evas_object_layer_set(o, 1);
|
|
|
|
evas_object_repeat_events_set(o, 1);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN,
|
2010-03-13 13:56:25 -08:00
|
|
|
_e_menu_cb_item_in, mi);
|
2012-06-21 00:11:47 -07:00
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT,
|
2009-03-24 14:11:03 -07:00
|
|
|
_e_menu_cb_item_out, mi);
|
2012-06-21 00:11:47 -07:00
|
|
|
evas_object_show(o);
|
|
|
|
mi->event_object = o;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
e_box_pack_end(mi->menu->container_object, mi->bg_object);
|
2012-11-14 02:27:27 -08:00
|
|
|
e_box_thaw(mi->container_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (mi->active) e_menu_item_active_set(mi, 1);
|
|
|
|
if (mi->toggle) e_menu_item_toggle_set(mi, 1);
|
2009-03-30 06:59:56 -07:00
|
|
|
if (mi->disable) e_menu_item_disabled_set(mi, 1);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_realize(E_Menu *m)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
2012-08-06 01:16:14 -07:00
|
|
|
Eina_List *l;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu_Item *mi;
|
2009-03-24 14:11:03 -07:00
|
|
|
int ok = 0;
|
2012-08-07 23:15:49 -07:00
|
|
|
int w, h;
|
|
|
|
|
2012-09-19 03:05:41 -07:00
|
|
|
if (m->realized || (!m->items)) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
m->realized = 1;
|
2011-12-25 22:24:59 -08:00
|
|
|
m->ecore_evas = e_canvas_new(m->zone->container->win,
|
|
|
|
m->cur.x, m->cur.y, m->cur.w, m->cur.h, 1, 1,
|
|
|
|
&(m->evas_win));
|
2004-11-24 19:37:45 -08:00
|
|
|
e_canvas_add(m->ecore_evas);
|
2010-01-14 20:41:20 -08:00
|
|
|
eina_hash_add(_e_menu_hash, e_util_winid_str_get(m->evas_win), m);
|
2005-01-11 05:43:01 -08:00
|
|
|
m->shape = e_container_shape_add(m->zone->container);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_container_shape_move(m->shape, m->cur.x, m->cur.y);
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_evas_callback_resize_set(m->ecore_evas, _e_menu_cb_ecore_evas_resize);
|
|
|
|
m->evas = ecore_evas_get(m->ecore_evas);
|
2005-05-26 08:30:10 -07:00
|
|
|
evas_event_freeze(m->evas);
|
2004-11-24 19:37:45 -08:00
|
|
|
/* move cursor out to avoid event cycles during setup */
|
2005-07-25 02:55:47 -07:00
|
|
|
evas_event_feed_mouse_in(m->evas, ecore_x_current_time_get(), NULL);
|
2012-06-20 23:19:43 -07:00
|
|
|
evas_event_feed_mouse_move(m->evas, -1000000, -1000000,
|
2009-10-25 11:42:47 -07:00
|
|
|
ecore_x_current_time_get(), NULL);
|
2005-04-13 08:52:34 -07:00
|
|
|
ecore_x_window_shape_events_select(m->evas_win, 1);
|
2004-11-24 19:37:45 -08:00
|
|
|
ecore_evas_name_class_set(m->ecore_evas, "E", "_e_menu_window");
|
|
|
|
ecore_evas_title_set(m->ecore_evas, "E Menu");
|
2009-09-06 13:04:20 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
o = edje_object_add(m->evas);
|
|
|
|
m->bg_object = o;
|
|
|
|
evas_object_name_set(o, "menu/background");
|
|
|
|
evas_object_data_set(o, "e_menu", m);
|
|
|
|
evas_object_move(o, 0, 0);
|
2005-04-22 22:16:25 -07:00
|
|
|
ok = e_theme_edje_object_set(o, "base/theme/menus",
|
2012-06-21 00:11:47 -07:00
|
|
|
"e/widgets/menu/default/background");
|
2005-04-13 08:52:34 -07:00
|
|
|
if (ok)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
const char *shape_option;
|
2009-10-25 11:42:47 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
shape_option = edje_object_data_get(o, "shaped");
|
|
|
|
if (shape_option)
|
|
|
|
{
|
|
|
|
if (!strcmp(shape_option, "1")) m->shaped = 1;
|
|
|
|
}
|
2005-04-13 08:52:34 -07:00
|
|
|
}
|
2006-08-09 08:24:34 -07:00
|
|
|
if (m->header.title)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
edje_object_part_text_set(o, "e.text.title", m->header.title);
|
|
|
|
edje_object_signal_emit(o, "e,action,show,title", "e");
|
|
|
|
edje_object_message_signal_process(o);
|
2006-08-09 08:24:34 -07:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
evas_object_show(o);
|
|
|
|
|
2005-04-13 08:52:34 -07:00
|
|
|
if (m->shaped)
|
2012-06-20 23:19:43 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (e_config->use_composite)
|
|
|
|
{
|
|
|
|
ecore_evas_alpha_set(m->ecore_evas, m->shaped);
|
2010-01-14 20:41:20 -08:00
|
|
|
|
|
|
|
eina_hash_del(_e_menu_hash, e_util_winid_str_get(m->evas_win), m);
|
|
|
|
m->evas_win = ecore_evas_software_x11_window_get(m->ecore_evas);
|
|
|
|
eina_hash_add(_e_menu_hash, e_util_winid_str_get(m->evas_win), m);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
ecore_evas_shaped_set(m->ecore_evas, m->shaped);
|
2008-03-22 10:59:52 -07:00
|
|
|
}
|
2009-09-06 13:04:20 -07:00
|
|
|
|
|
|
|
ecore_x_netwm_window_type_set(m->evas_win, ECORE_X_WINDOW_TYPE_MENU);
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
o = e_box_add(m->evas);
|
|
|
|
m->container_object = o;
|
2008-07-07 20:50:16 -07:00
|
|
|
evas_object_intercept_move_callback_add(o, _e_menu_cb_intercept_container_move, m);
|
2004-11-24 19:37:45 -08:00
|
|
|
evas_object_intercept_resize_callback_add(o, _e_menu_cb_intercept_container_resize, m);
|
|
|
|
e_box_freeze(o);
|
|
|
|
evas_object_show(o);
|
|
|
|
e_box_homogenous_set(o, 0);
|
2006-08-22 00:39:11 -07:00
|
|
|
edje_object_part_swallow(m->bg_object, "e.swallow.content", m->container_object);
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-08-06 01:16:14 -07:00
|
|
|
EINA_LIST_FOREACH(m->items, l, mi)
|
|
|
|
_e_menu_item_realize(mi);
|
2006-01-06 15:45:13 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_items_layout_update(m);
|
2009-03-25 17:47:36 -07:00
|
|
|
e_box_thaw(m->container_object);
|
2012-11-15 00:57:01 -08:00
|
|
|
w = m->cur.w;
|
|
|
|
h = m->cur.h;
|
|
|
|
e_container_shape_resize(m->shape, w, h);
|
2012-08-07 23:15:49 -07:00
|
|
|
evas_object_resize(m->bg_object, w, h);
|
2005-05-26 08:30:10 -07:00
|
|
|
evas_event_thaw(m->evas);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_items_layout_update(E_Menu *m)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu_Item *mi;
|
2012-12-30 02:53:29 -08:00
|
|
|
Evas_Coord bw, bh, mw = 0, mh = 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
int toggles_on = 0;
|
|
|
|
int icons_on = 0;
|
|
|
|
int labels_on = 0;
|
|
|
|
int submenus_on = 0;
|
|
|
|
int min_icon_w = 0, min_icon_h = 0;
|
|
|
|
int min_label_w = 0, min_label_h = 0;
|
|
|
|
int min_submenu_w = 0, min_submenu_h = 0;
|
|
|
|
int min_toggle_w = 0, min_toggle_h = 0;
|
|
|
|
int min_w = 0, min_h = 0;
|
2012-12-27 19:28:25 -08:00
|
|
|
int zh = 0, ms = 0, maxh = 0;
|
2012-11-28 19:02:16 -08:00
|
|
|
unsigned int cur_items = 0, max_items = -1;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
e_box_freeze(m->container_object);
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(m->items, l, mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->icon) icons_on = 1;
|
|
|
|
if (mi->icon_object) icons_on = 1;
|
|
|
|
if (mi->label) labels_on = 1;
|
|
|
|
if (mi->submenu) submenus_on = 1;
|
2012-12-12 03:06:40 -08:00
|
|
|
if (mi->submenu_pre_cb.func) submenus_on = 1;
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->check) toggles_on = 1;
|
|
|
|
if (mi->radio) toggles_on = 1;
|
|
|
|
|
|
|
|
if (mi->icon_w > min_icon_w) min_icon_w = mi->icon_w;
|
|
|
|
if (mi->icon_h > min_icon_h) min_icon_h = mi->icon_h;
|
|
|
|
if (mi->label_w > min_label_w) min_label_w = mi->label_w;
|
|
|
|
if (mi->label_h > min_label_h) min_label_h = mi->label_h;
|
|
|
|
if (mi->submenu_w > min_submenu_w) min_submenu_w = mi->submenu_w;
|
|
|
|
if (mi->submenu_h > min_submenu_h) min_submenu_h = mi->submenu_h;
|
|
|
|
if (mi->toggle_w > min_toggle_w) min_toggle_w = mi->toggle_w;
|
|
|
|
if (mi->toggle_h > min_toggle_h) min_toggle_h = mi->toggle_h;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (labels_on)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (submenus_on)
|
|
|
|
{
|
|
|
|
if (min_label_h < min_submenu_h)
|
|
|
|
min_label_h = min_submenu_h;
|
|
|
|
}
|
|
|
|
if (toggles_on)
|
|
|
|
{
|
|
|
|
if (min_label_h < min_toggle_h)
|
|
|
|
min_label_h = min_toggle_h;
|
|
|
|
}
|
|
|
|
if ((icons_on) && (min_icon_h > 0))
|
|
|
|
{
|
|
|
|
min_icon_w = (min_icon_w * min_label_h) / min_icon_h;
|
|
|
|
min_icon_h = min_label_h;
|
|
|
|
}
|
|
|
|
min_w = min_label_w + min_icon_w + min_submenu_w + min_toggle_w;
|
|
|
|
min_h = min_label_h;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (icons_on)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (submenus_on)
|
|
|
|
{
|
|
|
|
if (min_icon_h < min_submenu_h)
|
|
|
|
min_icon_h = min_submenu_h;
|
|
|
|
}
|
|
|
|
if (toggles_on)
|
|
|
|
{
|
|
|
|
if (min_icon_h < min_toggle_h)
|
|
|
|
min_icon_h = min_toggle_h;
|
|
|
|
}
|
|
|
|
min_w = min_icon_w + min_toggle_w + min_submenu_w;
|
|
|
|
min_h = min_icon_h;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (toggles_on)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (submenus_on)
|
|
|
|
{
|
|
|
|
if (min_toggle_h < min_submenu_h)
|
|
|
|
min_toggle_h = min_submenu_h;
|
|
|
|
}
|
|
|
|
min_w = min_toggle_w + min_submenu_w;
|
|
|
|
min_h = min_toggle_h;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2012-12-04 01:08:19 -08:00
|
|
|
if (min_h * eina_list_count(m->items) >= (unsigned int)m->zone->h)
|
|
|
|
{
|
|
|
|
e_zone_useful_geometry_get(m->zone, NULL, NULL, NULL, &zh);
|
2012-12-30 02:53:29 -08:00
|
|
|
maxh = zh * 4;
|
2012-12-27 19:28:25 -08:00
|
|
|
if (maxh > 30000) maxh = 30000; // 32k x 32k mx coord limit for wins
|
|
|
|
max_items = (maxh / min_h) - 1;
|
2012-12-04 01:08:19 -08:00
|
|
|
}
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(m->items, l, mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-12-30 02:53:29 -08:00
|
|
|
if (cur_items >= max_items)
|
2012-11-28 19:02:16 -08:00
|
|
|
{
|
|
|
|
_e_menu_item_unrealize(mi);
|
|
|
|
continue;
|
|
|
|
}
|
2012-12-04 01:08:19 -08:00
|
|
|
cur_items++;
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->separator)
|
|
|
|
{
|
|
|
|
e_box_pack_options_set(mi->separator_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
1, 0, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
mi->separator_w, mi->separator_h, /* min */
|
|
|
|
-1, mi->separator_h /* max */
|
|
|
|
);
|
2012-12-04 01:08:19 -08:00
|
|
|
ms += mi->separator_h;
|
|
|
|
continue;
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
2012-12-04 01:08:19 -08:00
|
|
|
e_box_freeze(mi->container_object);
|
|
|
|
if (toggles_on)
|
|
|
|
e_box_pack_options_set(mi->toggle_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
min_toggle_w, min_toggle_h, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
2012-06-21 00:11:47 -07:00
|
|
|
else
|
2012-12-04 01:08:19 -08:00
|
|
|
e_box_pack_options_set(mi->toggle_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 0, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
0, 0, /* min */
|
|
|
|
0, 0 /* max */
|
|
|
|
);
|
|
|
|
if (icons_on)
|
2012-06-21 00:11:47 -07:00
|
|
|
{
|
2012-12-04 01:08:19 -08:00
|
|
|
if (mi->icon_bg_object)
|
|
|
|
e_box_pack_options_set(mi->icon_bg_object,
|
2012-06-21 00:11:47 -07:00
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
2012-12-04 01:08:19 -08:00
|
|
|
min_icon_w, min_icon_h, /* min */
|
2012-06-21 00:11:47 -07:00
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
|
|
|
else
|
|
|
|
e_box_pack_options_set(mi->icon_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
2012-12-04 01:08:19 -08:00
|
|
|
min_icon_w, min_icon_h, /* min */
|
2012-06-21 00:11:47 -07:00
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
|
|
|
}
|
2012-12-04 01:08:19 -08:00
|
|
|
else
|
|
|
|
e_box_pack_options_set(mi->icon_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
0, 0, /* min */
|
|
|
|
0, 0 /* max */
|
|
|
|
);
|
|
|
|
if (labels_on)
|
|
|
|
e_box_pack_options_set(mi->label_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
min_label_w, min_label_h, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
|
|
|
else
|
|
|
|
e_box_pack_options_set(mi->label_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 0, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
0, 0, /* min */
|
|
|
|
0, 0 /* max */
|
|
|
|
);
|
|
|
|
if (submenus_on)
|
|
|
|
e_box_pack_options_set(mi->submenu_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 1, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
min_submenu_w, min_submenu_h, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
|
|
|
else
|
|
|
|
e_box_pack_options_set(mi->submenu_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
0, 0, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
0, 0, /* min */
|
|
|
|
0, 0 /* max */
|
|
|
|
);
|
|
|
|
edje_extern_object_min_size_set(mi->container_object,
|
|
|
|
min_w, min_h);
|
|
|
|
edje_object_part_swallow(mi->bg_object, "e.swallow.content",
|
|
|
|
mi->container_object);
|
|
|
|
edje_object_size_min_calc(mi->bg_object, &mw, &mh);
|
|
|
|
e_box_pack_options_set(mi->bg_object,
|
|
|
|
1, 1, /* fill */
|
|
|
|
1, 0, /* expand */
|
|
|
|
0.5, 0.5, /* align */
|
|
|
|
mw, mh, /* min */
|
|
|
|
-1, -1 /* max */
|
|
|
|
);
|
|
|
|
ms += mh;
|
|
|
|
e_box_thaw(mi->container_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2012-08-06 01:16:14 -07:00
|
|
|
e_box_size_min_get(m->container_object, &bw, &bh);
|
2004-11-24 19:37:45 -08:00
|
|
|
edje_extern_object_min_size_set(m->container_object, bw, bh);
|
|
|
|
edje_extern_object_max_size_set(m->container_object, bw, bh);
|
2006-08-22 00:39:11 -07:00
|
|
|
edje_object_part_swallow(m->bg_object, "e.swallow.content", m->container_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
edje_object_size_min_calc(m->bg_object, &mw, &mh);
|
|
|
|
e_box_thaw(m->container_object);
|
|
|
|
m->cur.w = mw;
|
|
|
|
m->cur.h = mh;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_unrealize(E_Menu_Item *mi)
|
|
|
|
{
|
2009-08-15 04:32:32 -07:00
|
|
|
if (mi->container_object) e_box_freeze(mi->container_object);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->separator_object) evas_object_del(mi->separator_object);
|
|
|
|
mi->separator_object = NULL;
|
|
|
|
if (mi->bg_object) evas_object_del(mi->bg_object);
|
|
|
|
mi->bg_object = NULL;
|
|
|
|
if (mi->container_object) evas_object_del(mi->container_object);
|
|
|
|
mi->container_object = NULL;
|
|
|
|
if (mi->toggle_object) evas_object_del(mi->toggle_object);
|
|
|
|
mi->toggle_object = NULL;
|
|
|
|
if (mi->icon_bg_object) evas_object_del(mi->icon_bg_object);
|
|
|
|
mi->icon_bg_object = NULL;
|
|
|
|
if (mi->icon_object) evas_object_del(mi->icon_object);
|
|
|
|
mi->icon_object = NULL;
|
|
|
|
if (mi->label_object) evas_object_del(mi->label_object);
|
|
|
|
mi->label_object = NULL;
|
|
|
|
if (mi->submenu_object) evas_object_del(mi->submenu_object);
|
|
|
|
mi->submenu_object = NULL;
|
|
|
|
if (mi->event_object) evas_object_del(mi->event_object);
|
|
|
|
mi->event_object = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_unrealize(E_Menu *m)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu_Item *mi;
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!m->realized) return;
|
2005-12-27 09:16:58 -08:00
|
|
|
evas_event_freeze(m->evas);
|
2004-11-24 19:37:45 -08:00
|
|
|
e_container_shape_hide(m->shape);
|
|
|
|
e_object_del(E_OBJECT(m->shape));
|
|
|
|
m->shape = NULL;
|
2005-12-27 09:16:58 -08:00
|
|
|
e_box_freeze(m->container_object);
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(m->items, l, mi)
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_item_unrealize(mi);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (m->header.icon) evas_object_del(m->header.icon);
|
|
|
|
m->header.icon = NULL;
|
|
|
|
if (m->bg_object) evas_object_del(m->bg_object);
|
|
|
|
m->bg_object = NULL;
|
|
|
|
if (m->container_object) evas_object_del(m->container_object);
|
|
|
|
m->container_object = NULL;
|
|
|
|
m->cur.visible = 0;
|
|
|
|
m->prev.visible = 0;
|
|
|
|
m->realized = 0;
|
2005-01-11 05:43:01 -08:00
|
|
|
m->zone = NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
e_canvas_del(m->ecore_evas);
|
|
|
|
ecore_evas_free(m->ecore_evas);
|
|
|
|
m->ecore_evas = NULL;
|
|
|
|
m->evas = NULL;
|
2010-05-01 12:28:27 -07:00
|
|
|
eina_hash_del(_e_menu_hash, e_util_winid_str_get(m->evas_win), m);
|
2004-11-24 19:37:45 -08:00
|
|
|
m->evas_win = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2005-01-11 05:43:01 -08:00
|
|
|
_e_menu_activate_internal(E_Menu *m, E_Zone *zone)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2008-12-29 04:40:49 -08:00
|
|
|
E_Menu_Category *cat = NULL;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2006-01-06 15:45:13 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (m->pre_activate_cb.func)
|
|
|
|
m->pre_activate_cb.func(m->pre_activate_cb.data, m);
|
|
|
|
m->fast_mouse = 0;
|
|
|
|
m->pending_new_submenu = 0;
|
|
|
|
if (!_e_menu_win)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_win = ecore_x_window_input_new(zone->container->win,
|
|
|
|
zone->x, zone->y,
|
|
|
|
zone->w, zone->h);
|
|
|
|
ecore_x_window_show(_e_menu_win);
|
|
|
|
if (!e_grabinput_get(_e_menu_win, 1, _e_menu_win))
|
|
|
|
{
|
|
|
|
ecore_x_window_free(_e_menu_win);
|
|
|
|
_e_menu_win = 0;
|
|
|
|
return;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-01-11 05:43:01 -08:00
|
|
|
if ((m->zone) && (m->zone->container != zone->container))
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
printf("FIXME: cannot move menus between containers yet\n");
|
|
|
|
return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2006-10-07 23:12:25 -07:00
|
|
|
m->zone = zone;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!m->active)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
/* this remove is in case the menu is marked as inactive but hasn't */
|
|
|
|
/* been removed from the list yet */
|
|
|
|
if (m->in_active_list)
|
|
|
|
{
|
|
|
|
_e_active_menus = eina_list_remove(_e_active_menus, m);
|
|
|
|
m->in_active_list = 0;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
|
|
|
}
|
|
|
|
_e_active_menus = eina_list_append(_e_active_menus, m);
|
|
|
|
m->in_active_list = 1;
|
|
|
|
m->active = 1;
|
|
|
|
e_object_ref(E_OBJECT(m));
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2006-01-06 15:45:13 -08:00
|
|
|
/* the foreign menu items */
|
2008-12-29 04:40:49 -08:00
|
|
|
if (m->category)
|
2006-06-20 06:10:08 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
cat = eina_hash_find(_e_menu_categories, m->category);
|
|
|
|
if (cat)
|
|
|
|
{
|
|
|
|
E_Menu_Category_Callback *cb;
|
|
|
|
EINA_LIST_FOREACH(cat->callbacks, l, cb)
|
2009-10-25 11:42:47 -07:00
|
|
|
if (cb->create) cb->create(m, cat->data, cb->data);
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
2006-06-20 06:10:08 -07:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
m->cur.visible = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_deactivate_all(void)
|
|
|
|
{
|
2009-03-23 05:28:15 -07:00
|
|
|
Eina_List *tmp;
|
|
|
|
E_Menu *m;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2009-03-23 05:28:15 -07:00
|
|
|
tmp = _e_active_menus_copy_ref();
|
|
|
|
|
|
|
|
EINA_LIST_FREE(tmp, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_deactivate(m);
|
|
|
|
m->parent_item = NULL;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2006-08-22 01:38:24 -07:00
|
|
|
_e_menu_activate_floating = 0;
|
|
|
|
_e_menu_activate_maybe_drag = 0;
|
|
|
|
_e_menu_activate_dragging = 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_deactivate_above(E_Menu *ma)
|
|
|
|
{
|
2009-03-23 05:28:15 -07:00
|
|
|
Eina_List *tmp;
|
2004-11-24 19:37:45 -08:00
|
|
|
int above = 0;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu *m;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2009-03-23 05:28:15 -07:00
|
|
|
tmp = _e_active_menus_copy_ref();
|
|
|
|
|
|
|
|
EINA_LIST_FREE(tmp, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (above)
|
|
|
|
{
|
|
|
|
e_menu_deactivate(m);
|
|
|
|
m->parent_item = NULL;
|
|
|
|
}
|
|
|
|
if (ma == m) above = 1;
|
|
|
|
e_object_unref(E_OBJECT(m));
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_submenu_activate(E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
if (!mi->menu->active) return;
|
|
|
|
if (mi->menu->fast_mouse)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
mi->menu->pending_new_submenu = 1;
|
|
|
|
return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
mi->menu->pending_new_submenu = 0;
|
|
|
|
_e_menu_deactivate_above(mi->menu);
|
2005-04-21 00:19:49 -07:00
|
|
|
if (mi->submenu_pre_cb.func)
|
|
|
|
mi->submenu_pre_cb.func(mi->submenu_pre_cb.data, mi->menu, mi);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (mi->submenu)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
E_Menu *m;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
m = mi->submenu;
|
|
|
|
e_object_ref(E_OBJECT(m));
|
|
|
|
m->parent_item = mi;
|
|
|
|
_e_menu_activate_internal(m, mi->menu->zone);
|
|
|
|
_e_menu_reposition(m);
|
|
|
|
e_object_unref(E_OBJECT(m));
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-04-21 00:45:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_submenu_deactivate(E_Menu_Item *mi)
|
|
|
|
{
|
2006-07-08 02:18:04 -07:00
|
|
|
if (!mi->menu->active) return;
|
2005-04-21 00:19:49 -07:00
|
|
|
if (mi->submenu_post_cb.func)
|
|
|
|
mi->submenu_post_cb.func(mi->submenu_post_cb.data, mi->menu, mi);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_reposition(E_Menu *m)
|
|
|
|
{
|
2009-03-23 05:28:15 -07:00
|
|
|
Eina_List *l, *tmp;
|
|
|
|
E_Menu_Item *mi;
|
2006-09-07 03:33:57 -07:00
|
|
|
int parent_item_bottom;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!m->parent_item) return;
|
|
|
|
m->cur.x = m->parent_item->menu->cur.x + m->parent_item->menu->cur.w;
|
2006-09-07 03:33:57 -07:00
|
|
|
|
|
|
|
parent_item_bottom = m->parent_item->menu->cur.y + m->parent_item->y;
|
2006-09-09 00:00:14 -07:00
|
|
|
if (m->cur.h > m->zone->h)
|
2006-09-07 03:33:57 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
/* menu is larger than screen */
|
|
|
|
if (parent_item_bottom > (m->zone->h / 2))
|
|
|
|
/* more is shown if menu goes up */
|
|
|
|
m->cur.y = (parent_item_bottom - (m->container_h + 1));
|
|
|
|
else
|
|
|
|
/* more is shown if menu goes down */
|
|
|
|
m->cur.y = parent_item_bottom - m->container_y;
|
2006-09-07 03:33:57 -07:00
|
|
|
}
|
|
|
|
else
|
2012-06-20 23:19:43 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
/* menu is smaller than screen */
|
|
|
|
if (((parent_item_bottom + m->cur.h - m->container_y) > m->zone->h) &&
|
|
|
|
(parent_item_bottom > (m->zone->h / 2)))
|
|
|
|
/* menu is partially out of screen and more is shown if menu goes up */
|
|
|
|
m->cur.y = (parent_item_bottom - (m->container_h + 1)) + m->parent_item->h;
|
|
|
|
else
|
|
|
|
m->cur.y = parent_item_bottom - m->container_y;
|
2006-09-07 03:33:57 -07:00
|
|
|
}
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* FIXME: this will suck for big menus */
|
2009-03-23 05:28:15 -07:00
|
|
|
tmp = _e_active_menus_copy_ref();
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(m->items, l, mi)
|
2009-10-25 11:42:47 -07:00
|
|
|
if ((mi->active) && (mi->submenu)) _e_menu_reposition(mi->submenu);
|
2009-03-23 05:28:15 -07:00
|
|
|
|
|
|
|
_e_menu_list_free_unref(tmp);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_menu_active_call(void)
|
|
|
|
{
|
2006-08-09 06:52:52 -07:00
|
|
|
E_Menu_Item *mi;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2006-08-09 06:52:52 -07:00
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->check)
|
|
|
|
e_menu_item_toggle_set(mi, !mi->toggle);
|
|
|
|
if ((mi->radio) && (!e_menu_item_toggle_get(mi)))
|
|
|
|
e_menu_item_toggle_set(mi, 1);
|
|
|
|
if (mi->cb.func)
|
|
|
|
mi->cb.func(mi->cb.data, mi->menu, mi);
|
|
|
|
return 1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2006-08-21 13:03:09 -07:00
|
|
|
static int
|
|
|
|
_e_menu_realize_call(E_Menu_Item *mi)
|
|
|
|
{
|
|
|
|
if (mi)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->realize_cb.func)
|
|
|
|
{
|
|
|
|
mi->realize_cb.func(mi->realize_cb.data, mi->menu, mi);
|
|
|
|
return 1;
|
|
|
|
}
|
2006-08-21 13:03:09 -07:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static void
|
|
|
|
_e_menu_item_activate_next(void)
|
|
|
|
{
|
2006-10-08 01:25:08 -07:00
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2006-10-08 01:25:08 -07:00
|
|
|
ll = _e_menu_list_item_active_get();
|
|
|
|
mi = _e_menu_item_active_get();
|
2012-06-20 23:19:43 -07:00
|
|
|
if (ll && mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
/* Look at the next item and then cycle until we're not on
|
|
|
|
* a separator. */
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (!eina_list_next(ll))
|
|
|
|
ll = mi->menu->items;
|
|
|
|
else
|
|
|
|
ll = eina_list_next(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
}
|
|
|
|
while (mi->separator || mi->disable);
|
2006-10-08 01:25:08 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2006-10-08 01:25:08 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_activate_first();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_activate_previous(void)
|
|
|
|
{
|
2006-10-08 01:25:08 -07:00
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2006-10-08 01:25:08 -07:00
|
|
|
ll = _e_menu_list_item_active_get();
|
|
|
|
mi = _e_menu_item_active_get();
|
2012-06-20 23:19:43 -07:00
|
|
|
if (ll && mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
/* Look at the prev item and then cycle until we're not on
|
|
|
|
* a separator. */
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (!eina_list_prev(ll))
|
|
|
|
ll = eina_list_last(ll);
|
|
|
|
else
|
|
|
|
ll = eina_list_prev(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
}
|
|
|
|
while ((mi->separator) || (mi->disable));
|
2006-10-08 01:25:08 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2006-10-08 01:25:08 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_activate_first();
|
|
|
|
}
|
|
|
|
|
2006-02-02 22:16:25 -08:00
|
|
|
static void
|
|
|
|
_e_menu_item_activate_first(void)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2006-02-02 22:16:25 -08:00
|
|
|
E_Menu_Item *mi;
|
|
|
|
|
|
|
|
m = _e_menu_active_get();
|
|
|
|
if (m)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
ll = m->items;
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
while ((mi->separator) && eina_list_next(ll))
|
|
|
|
{
|
|
|
|
ll = eina_list_next(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
}
|
|
|
|
if (mi->separator) return;
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
2006-02-02 22:16:25 -08:00
|
|
|
}
|
|
|
|
_e_menu_activate_first();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_activate_last(void)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2006-02-02 22:16:25 -08:00
|
|
|
E_Menu_Item *mi;
|
|
|
|
|
|
|
|
m = _e_menu_active_get();
|
|
|
|
if (m)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
ll = eina_list_last(m->items);
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
while ((mi->separator) && eina_list_prev(ll))
|
|
|
|
{
|
|
|
|
ll = eina_list_prev(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
}
|
|
|
|
if (mi->separator) return;
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
2006-02-02 22:16:25 -08:00
|
|
|
}
|
|
|
|
_e_menu_activate_first();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_activate_nth(int n)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2009-03-24 14:11:03 -07:00
|
|
|
int i = -1;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2006-02-02 22:16:25 -08:00
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (!mi)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_activate_first();
|
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (!mi) return;
|
2006-02-02 22:16:25 -08:00
|
|
|
}
|
|
|
|
m = mi->menu;
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(m->items, ll, mi)
|
2006-02-02 22:16:25 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (!mi->separator) i++;
|
|
|
|
if (i == n) break;
|
2006-02-02 22:16:25 -08:00
|
|
|
}
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
}
|
|
|
|
|
2006-10-08 01:25:08 -07:00
|
|
|
static void
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_item_activate_char(const char *key_compose)
|
2006-10-08 01:25:08 -07:00
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll, *ll_orig;
|
2006-10-08 01:25:08 -07:00
|
|
|
|
|
|
|
/* Ignore modifiers and such. */
|
|
|
|
if (!key_compose) return;
|
|
|
|
|
|
|
|
/* Check we've got a menu and it's active. */
|
|
|
|
m = _e_menu_active_get();
|
2012-06-20 23:19:43 -07:00
|
|
|
if (!m)
|
2006-10-08 01:25:08 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (!_e_active_menus) return;
|
|
|
|
m = eina_list_data_get(_e_active_menus);
|
|
|
|
if (!m) return;
|
2006-10-08 01:25:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ll = _e_menu_list_item_active_get();
|
|
|
|
/* If we don't have an active item, start from the top of the list. */
|
|
|
|
if (!ll)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
ll = m->items;
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
/* Only check the current item if it wasn't active before. */
|
|
|
|
if (!mi->separator && mi->label && !strncasecmp(key_compose, mi->label, strlen(key_compose)))
|
|
|
|
{
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
|
|
|
}
|
2006-10-08 01:25:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
ll_orig = ll;
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
mi = eina_list_data_get(ll);
|
2012-06-20 23:19:43 -07:00
|
|
|
if (!eina_list_next(ll))
|
2006-10-08 01:25:08 -07:00
|
|
|
ll = mi->menu->items;
|
|
|
|
else
|
2009-08-21 08:08:49 -07:00
|
|
|
ll = eina_list_next(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
2006-10-08 01:25:08 -07:00
|
|
|
|
|
|
|
/* While we don't have a label OR we don't match AND we haven't
|
|
|
|
* wrapped around */
|
2012-06-20 23:19:43 -07:00
|
|
|
while ((!mi->label || strncasecmp(key_compose, mi->label, strlen(key_compose)))
|
2009-10-25 11:42:47 -07:00
|
|
|
&& ll != ll_orig)
|
2006-10-08 01:25:08 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
do
|
|
|
|
{
|
|
|
|
if (!eina_list_next(ll))
|
|
|
|
ll = mi->menu->items;
|
|
|
|
else
|
|
|
|
ll = eina_list_next(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
}
|
|
|
|
while (mi->separator);
|
2006-10-08 01:25:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static void
|
|
|
|
_e_menu_activate_next(void)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
|
|
|
|
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (mi)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->submenu)
|
|
|
|
{
|
|
|
|
if (mi->submenu->items)
|
|
|
|
{
|
2012-06-21 05:09:08 -07:00
|
|
|
Eina_List *l;
|
|
|
|
EINA_LIST_FOREACH(mi->submenu->items, l, mi)
|
|
|
|
if (!mi->disable)
|
|
|
|
{
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
break;
|
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
_e_menu_activate_first();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_activate_previous(void)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
|
|
|
|
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (mi)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->menu->parent_item)
|
|
|
|
{
|
|
|
|
mi = mi->menu->parent_item;
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
}
|
|
|
|
return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-05-18 03:18:02 -07:00
|
|
|
_e_menu_activate_last();
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_activate_first(void)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!_e_active_menus) return;
|
2009-08-21 08:08:49 -07:00
|
|
|
m = eina_list_data_get(_e_active_menus);
|
2004-11-24 19:37:45 -08:00
|
|
|
if (!m->items) return;
|
|
|
|
ll = m->items;
|
2009-08-21 08:08:49 -07:00
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
while ((mi->separator) && eina_list_next(ll))
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
ll = eina_list_next(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (mi->separator) return;
|
2012-06-20 23:19:43 -07:00
|
|
|
e_menu_item_active_set(mi, 1);
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
}
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
static void
|
|
|
|
_e_menu_activate_last(void)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
if (!_e_active_menus) return;
|
2009-08-21 08:08:49 -07:00
|
|
|
m = eina_list_data_get(_e_active_menus);
|
2005-05-18 03:18:02 -07:00
|
|
|
if (!m->items) return;
|
2008-10-22 04:49:33 -07:00
|
|
|
ll = eina_list_last(m->items);
|
2009-08-21 08:08:49 -07:00
|
|
|
mi = eina_list_data_get(ll);
|
|
|
|
while ((mi->separator) && eina_list_prev(ll))
|
2005-05-18 03:18:02 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
ll = eina_list_prev(ll);
|
|
|
|
mi = eina_list_data_get(ll);
|
2005-05-18 03:18:02 -07:00
|
|
|
}
|
|
|
|
if (mi->separator) return;
|
2012-06-20 23:19:43 -07:00
|
|
|
e_menu_item_active_set(mi, 1);
|
2005-05-18 03:18:02 -07:00
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
}
|
|
|
|
|
2006-12-28 06:15:10 -08:00
|
|
|
#if 0
|
2004-11-24 19:37:45 -08:00
|
|
|
static void
|
|
|
|
_e_menu_activate_nth(int n)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
E_Menu_Item *mi;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *ll;
|
2009-03-24 14:11:03 -07:00
|
|
|
int i = -1;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (!mi)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_activate_first();
|
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (!mi) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
m = mi->menu;
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(m->items, ll, mi)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (!mi->separator) i++;
|
|
|
|
if (i == n)
|
|
|
|
{
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
_e_menu_item_ensure_onscreen(mi);
|
|
|
|
return;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
|
2006-12-28 06:15:10 -08:00
|
|
|
#endif
|
2004-11-24 19:37:45 -08:00
|
|
|
|
|
|
|
static E_Menu *
|
|
|
|
_e_menu_active_get(void)
|
|
|
|
{
|
2006-08-09 06:56:23 -07:00
|
|
|
if (_e_active_menu_item) return _e_active_menu_item->menu;
|
|
|
|
return NULL;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static E_Menu_Item *
|
|
|
|
_e_menu_item_active_get(void)
|
|
|
|
{
|
2006-08-09 06:52:52 -07:00
|
|
|
return _e_active_menu_item;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2012-06-20 23:19:43 -07:00
|
|
|
static Eina_List *
|
2006-10-08 01:25:08 -07:00
|
|
|
_e_menu_list_item_active_get(void)
|
|
|
|
{
|
|
|
|
if (_e_active_menu_item)
|
2009-03-24 14:11:03 -07:00
|
|
|
return _e_active_menu_item->list_position;
|
2006-10-08 01:25:08 -07:00
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static int
|
|
|
|
_e_menu_outside_bounds_get(int xdir, int ydir)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu *m;
|
2004-11-24 19:37:45 -08:00
|
|
|
int outl = 0;
|
|
|
|
int outr = 0;
|
|
|
|
int outt = 0;
|
|
|
|
int outb = 0;
|
2009-03-24 14:11:03 -07:00
|
|
|
int i = 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (m->cur.x < m->zone->x + e_config->menu_autoscroll_margin)
|
|
|
|
{
|
|
|
|
i = m->zone->x - m->cur.x + e_config->menu_autoscroll_margin;
|
|
|
|
if (i > outl) outl = i;
|
|
|
|
}
|
|
|
|
if (m->cur.y < m->zone->y + e_config->menu_autoscroll_margin)
|
|
|
|
{
|
|
|
|
i = m->zone->y - m->cur.y + e_config->menu_autoscroll_margin;
|
|
|
|
if (i > outt) outt = i;
|
|
|
|
}
|
|
|
|
if ((m->cur.x + m->cur.w) > (m->zone->w - e_config->menu_autoscroll_margin))
|
|
|
|
{
|
|
|
|
i = m->cur.x + m->cur.w - (m->zone->x + m->zone->w - e_config->menu_autoscroll_margin);
|
|
|
|
if (i > outr) outr = i;
|
|
|
|
}
|
|
|
|
if ((m->cur.y + m->cur.h) > (m->zone->h - e_config->menu_autoscroll_margin))
|
|
|
|
{
|
|
|
|
i = m->cur.y + m->cur.h - (m->zone->y + m->zone->h - e_config->menu_autoscroll_margin);
|
|
|
|
if (i > outb) outb = i;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (xdir == -1)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (outl) return outl;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (xdir == 1)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (outr) return outr;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (ydir == -1)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (outt) return outt;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (ydir == 1)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (outb) return outb;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_scroll_by(int dx, int dy)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu *m;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
m->cur.x += dx;
|
|
|
|
m->cur.y += dy;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_mouse_autoscroll_check(void)
|
|
|
|
{
|
|
|
|
int autoscroll_x = 0;
|
|
|
|
int autoscroll_y = 0;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2005-08-21 22:50:49 -07:00
|
|
|
if (_e_menu_x - e_config->menu_autoscroll_cursor_margin <= 0)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (_e_menu_outside_bounds_get(-1, 0)) autoscroll_x = -1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2005-08-21 22:50:49 -07:00
|
|
|
if (_e_menu_y - e_config->menu_autoscroll_cursor_margin <= 0)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (_e_menu_outside_bounds_get(0, -1)) autoscroll_y = -1;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if ((!autoscroll_x) && (!autoscroll_y))
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (_e_active_menus)
|
|
|
|
{
|
|
|
|
E_Menu *m;
|
|
|
|
|
|
|
|
m = eina_list_data_get(_e_active_menus);
|
|
|
|
if (_e_menu_x + e_config->menu_autoscroll_cursor_margin >= (m->zone->w - 1))
|
|
|
|
{
|
|
|
|
if (_e_menu_outside_bounds_get(1, 0)) autoscroll_x = 1;
|
|
|
|
}
|
|
|
|
if (_e_menu_y + e_config->menu_autoscroll_cursor_margin >= (m->zone->h - 1))
|
|
|
|
{
|
|
|
|
if (_e_menu_outside_bounds_get(0, 1)) autoscroll_y = 1;
|
|
|
|
}
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
_e_menu_autoscroll_x = autoscroll_x;
|
|
|
|
_e_menu_autoscroll_y = autoscroll_y;
|
|
|
|
if ((!autoscroll_x) && (!autoscroll_y)) return;
|
2008-01-10 23:33:57 -08:00
|
|
|
if (_e_menu_scroll_animator) return;
|
|
|
|
_e_menu_scroll_animator = ecore_animator_add(_e_menu_cb_scroll_animator,
|
2012-06-21 00:11:47 -07:00
|
|
|
NULL);
|
2008-11-01 19:36:10 -07:00
|
|
|
_e_menu_scroll_start = ecore_loop_time_get();
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_menu_item_ensure_onscreen(E_Menu_Item *mi)
|
|
|
|
{
|
2009-03-24 14:11:03 -07:00
|
|
|
int x = 0, y = 0, w = 0, h = 0;
|
|
|
|
int dx = 0, dy = 0;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2005-12-27 09:16:58 -08:00
|
|
|
if (!mi->menu) return;
|
|
|
|
if (!mi->menu->zone) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
x = mi->x + mi->menu->cur.x;
|
|
|
|
y = mi->y + mi->menu->cur.y;
|
|
|
|
w = mi->w;
|
|
|
|
h = mi->h;
|
2005-01-11 05:43:01 -08:00
|
|
|
if ((x + w) > (mi->menu->zone->x + mi->menu->zone->w))
|
|
|
|
dx = (mi->menu->zone->x + mi->menu->zone->w) - (x + w);
|
2005-12-27 09:16:58 -08:00
|
|
|
else if (x < mi->menu->zone->x)
|
|
|
|
dx = mi->menu->zone->x - x;
|
2005-01-11 05:43:01 -08:00
|
|
|
if ((y + h) > (mi->menu->zone->y + mi->menu->zone->h))
|
|
|
|
dy = (mi->menu->zone->y + mi->menu->zone->h) - (y + h);
|
2005-12-27 09:16:58 -08:00
|
|
|
else if (y < mi->menu->zone->y)
|
|
|
|
dy = mi->menu->zone->y - y;
|
2004-11-24 19:37:45 -08:00
|
|
|
if ((dx != 0) || (dy != 0))
|
|
|
|
_e_menu_scroll_by(dx, dy);
|
|
|
|
}
|
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
static int
|
|
|
|
_e_menu_auto_place(E_Menu *m, int x, int y, int w, int h)
|
|
|
|
{
|
|
|
|
double xr, yr;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2005-05-18 03:18:02 -07:00
|
|
|
_e_menu_realize(m);
|
|
|
|
/* +-----+
|
|
|
|
* |\ T /|
|
|
|
|
* | \ / |
|
|
|
|
* |L X R|
|
|
|
|
* | / \ |
|
|
|
|
* |/ B \|
|
|
|
|
* +-----+
|
2012-06-20 23:19:43 -07:00
|
|
|
*
|
2005-05-18 03:18:02 -07:00
|
|
|
* quadrants... which one
|
|
|
|
*/
|
2005-05-19 23:30:26 -07:00
|
|
|
if (w != m->zone->w)
|
|
|
|
xr = (double)(x - m->zone->x) /
|
2012-06-21 00:11:47 -07:00
|
|
|
(double)(m->zone->w - w);
|
2005-05-18 03:18:02 -07:00
|
|
|
else
|
|
|
|
xr = 0.0;
|
2005-05-19 23:30:26 -07:00
|
|
|
if (h != m->zone->h)
|
|
|
|
yr = (double)(y - m->zone->y) /
|
2012-06-21 00:11:47 -07:00
|
|
|
(double)(m->zone->h - h);
|
2005-05-18 03:18:02 -07:00
|
|
|
else
|
|
|
|
yr = 0.0;
|
|
|
|
if ((xr + yr) < 0.99) /* top or left */
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (((1.0 - yr) + xr) <= 1.0)
|
|
|
|
{
|
|
|
|
/* L */
|
|
|
|
m->cur.x = x + w;
|
|
|
|
if (y < (m->zone->y + ((m->zone->h * 1) / 3)))
|
|
|
|
m->cur.y = y;
|
|
|
|
else if (y < (m->zone->y + ((m->zone->h * 2) / 3)))
|
|
|
|
m->cur.y = y + ((h - m->cur.h) / 2);
|
|
|
|
else
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
/* T */
|
|
|
|
{
|
|
|
|
m->cur.y = y + h;
|
|
|
|
if (x < (m->zone->x + ((m->zone->w * 1) / 3)))
|
|
|
|
m->cur.x = x;
|
|
|
|
else if (x < (m->zone->x + ((m->zone->w * 2) / 3)))
|
|
|
|
m->cur.x = x + ((w - m->cur.w) / 2);
|
|
|
|
else
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
return 3;
|
|
|
|
}
|
2005-05-18 03:18:02 -07:00
|
|
|
}
|
|
|
|
else /* bottom or right */
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (((1.0 - yr) + xr) <= 1.01)
|
|
|
|
{
|
|
|
|
/* B */
|
|
|
|
m->cur.y = y - m->cur.h;
|
|
|
|
if (x < (m->zone->x + ((m->zone->w * 1) / 3)))
|
|
|
|
m->cur.x = x;
|
|
|
|
else if (x < (m->zone->x + ((m->zone->w * 2) / 3)))
|
|
|
|
m->cur.x = x + ((w - m->cur.w) / 2);
|
|
|
|
else
|
|
|
|
m->cur.x = x + w - m->cur.w;
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
/* R */
|
|
|
|
{
|
|
|
|
m->cur.x = x - m->cur.w;
|
|
|
|
if (y < (m->zone->y + ((m->zone->h * 1) / 3)))
|
|
|
|
m->cur.y = y;
|
|
|
|
else if (y < (m->zone->y + ((m->zone->h * 2) / 3)))
|
|
|
|
m->cur.y = y + ((h - m->cur.h) / 2);
|
|
|
|
else
|
|
|
|
m->cur.y = y + h - m->cur.h;
|
|
|
|
return 2;
|
|
|
|
}
|
2005-05-18 03:18:02 -07:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
static void
|
|
|
|
_e_menu_cb_ecore_evas_resize(Ecore_Evas *ee)
|
|
|
|
{
|
|
|
|
Evas *evas;
|
|
|
|
Evas_Object *o;
|
|
|
|
Evas_Coord w, h;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
evas = ecore_evas_get(ee);
|
|
|
|
evas_output_viewport_get(evas, NULL, NULL, &w, &h);
|
|
|
|
o = evas_object_name_find(evas, "menu/background");
|
|
|
|
evas_object_resize(o, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_item_in(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-09-11 04:55:08 -07:00
|
|
|
if (_e_menu_lock) return;
|
2004-11-24 19:37:45 -08:00
|
|
|
mi = data;
|
|
|
|
e_menu_item_active_set(mi, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_item_out(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
2006-08-22 01:38:24 -07:00
|
|
|
Evas_Event_Mouse_In *ev;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
mi = data;
|
2006-08-22 01:38:24 -07:00
|
|
|
ev = event_info;
|
2004-11-24 19:37:45 -08:00
|
|
|
e_menu_item_active_set(mi, 0);
|
2006-08-22 01:38:24 -07:00
|
|
|
if (_e_menu_activate_maybe_drag)
|
2007-01-03 08:53:48 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (mi->drag_cb.func)
|
|
|
|
{
|
|
|
|
/* User is dragging a draggable item elsewhere. */
|
|
|
|
mi->drag.x = ev->output.x - (ev->output.x - mi->x);
|
|
|
|
mi->drag.y = ev->output.y - (ev->output.y - mi->y);
|
|
|
|
_e_menu_deactivate_all();
|
|
|
|
mi->drag_cb.func(mi->drag_cb.data, mi->menu, mi);
|
|
|
|
}
|
|
|
|
/* Either way, the maybe drag stops here. */
|
|
|
|
_e_menu_activate_maybe_drag = 0;
|
2007-01-03 08:53:48 -08:00
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Key *ev;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
2010-06-24 09:19:12 -07:00
|
|
|
if (ev->window != _e_menu_win) return ECORE_CALLBACK_PASS_ON;
|
2009-10-25 11:42:47 -07:00
|
|
|
if ((!strcmp(ev->key, "Up")) || (!strcmp(ev->key, "KP_Up")))
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_item_activate_previous();
|
2009-10-25 11:42:47 -07:00
|
|
|
else if ((!strcmp(ev->key, "Down")) || (!strcmp(ev->key, "KP_Down")))
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_item_activate_next();
|
2009-10-25 11:42:47 -07:00
|
|
|
else if ((!strcmp(ev->key, "Left")) || (!strcmp(ev->key, "KP_Left")))
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_activate_previous();
|
2009-10-25 11:42:47 -07:00
|
|
|
else if ((!strcmp(ev->key, "Right")) || (!strcmp(ev->key, "KP_Right")))
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_activate_next();
|
2009-10-25 11:42:47 -07:00
|
|
|
else if ((!strcmp(ev->key, "Home")) || (!strcmp(ev->key, "KP_Home")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_first();
|
2009-10-25 11:42:47 -07:00
|
|
|
else if ((!strcmp(ev->key, "End")) || (!strcmp(ev->key, "KP_End")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_last();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (!strcmp(ev->key, "space"))
|
2009-10-25 11:42:47 -07:00
|
|
|
_e_menu_active_call();
|
|
|
|
else if ((!strcmp(ev->key, "Return")) || (!strcmp(ev->key, "KP_Enter")))
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_active_call();
|
|
|
|
_e_menu_deactivate_all();
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (!strcmp(ev->key, "Escape"))
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_deactivate_all();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "1")) || (!strcmp(ev->key, "KP_1")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_first();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "2")) || (!strcmp(ev->key, "KP_2")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(1);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "3")) || (!strcmp(ev->key, "KP_3")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(2);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "4")) || (!strcmp(ev->key, "KP_4")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(3);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "5")) || (!strcmp(ev->key, "KP_5")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(4);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "6")) || (!strcmp(ev->key, "KP_6")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(5);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "7")) || (!strcmp(ev->key, "KP_7")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(6);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "8")) || (!strcmp(ev->key, "KP_8")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(7);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "9")) || (!strcmp(ev->key, "KP_9")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_nth(8);
|
2009-03-16 09:24:43 -07:00
|
|
|
else if ((!strcmp(ev->key, "0")) || (!strcmp(ev->key, "KP_0")))
|
2006-02-02 22:16:25 -08:00
|
|
|
_e_menu_item_activate_last();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (ev->compose)
|
|
|
|
_e_menu_item_activate_char(ev->compose);
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Key *ev;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
2010-06-24 09:19:12 -07:00
|
|
|
if (ev->window != _e_menu_win) return ECORE_CALLBACK_PASS_ON;
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* we need all of these because menus are special and grab the mouse and
|
2010-09-08 16:59:07 -07:00
|
|
|
* keyboard and thus the normal event mechanism doesn't work, so we feed
|
2004-11-24 19:37:45 -08:00
|
|
|
* events directly to the canvases from our grab window
|
|
|
|
*/
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_mouse_down(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Mouse_Button *ev;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
2010-06-24 09:19:12 -07:00
|
|
|
if (ev->window != _e_menu_win) return ECORE_CALLBACK_PASS_ON;
|
2006-08-22 01:38:24 -07:00
|
|
|
|
|
|
|
/* Only allow dragging from floating menus for now.
|
2012-06-20 23:19:43 -07:00
|
|
|
* The reason for this is that for non floating menus,
|
2006-08-22 01:38:24 -07:00
|
|
|
* the mouse is already down and dragging, so the decision
|
|
|
|
* to start a drag is much more complex.
|
|
|
|
*/
|
|
|
|
if (_e_menu_activate_floating)
|
2007-01-03 08:53:48 -08:00
|
|
|
_e_menu_activate_maybe_drag = 1;
|
2006-08-22 01:38:24 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Mouse_Button *ev;
|
2005-07-25 02:55:47 -07:00
|
|
|
Ecore_X_Time t;
|
2006-08-22 01:38:24 -07:00
|
|
|
int ret = 0;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
2010-06-24 09:19:12 -07:00
|
|
|
if (ev->window != _e_menu_win) return ECORE_CALLBACK_PASS_ON;
|
2006-08-22 01:38:24 -07:00
|
|
|
|
2009-03-16 09:24:43 -07:00
|
|
|
t = ev->timestamp - _e_menu_activate_time;
|
2005-07-25 02:55:47 -07:00
|
|
|
if ((_e_menu_activate_time != 0) &&
|
|
|
|
(t < (e_config->menus_click_drag_timeout * 1000)))
|
2005-06-16 02:12:44 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_activate_floating = 1;
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2005-06-16 02:12:44 -07:00
|
|
|
}
|
2005-05-03 01:29:26 -07:00
|
|
|
|
2006-08-22 01:38:24 -07:00
|
|
|
if (_e_menu_activate_dragging)
|
2007-01-03 08:53:48 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
/* FIXME: This is a drop, which is not allowed for now.
|
|
|
|
* Once dragging is working, this will be subject to some experimenattion.
|
|
|
|
*/
|
2007-01-03 08:53:48 -08:00
|
|
|
}
|
2006-08-22 01:38:24 -07:00
|
|
|
else
|
2012-06-21 00:11:47 -07:00
|
|
|
ret = _e_menu_active_call();
|
2006-08-22 01:38:24 -07:00
|
|
|
_e_menu_activate_maybe_drag = 0;
|
|
|
|
_e_menu_activate_dragging = 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (ret == 1)
|
|
|
|
{
|
2012-06-20 23:19:43 -07:00
|
|
|
/* allow mouse to pop down menu if clicked elsewhere */
|
2005-07-25 02:55:47 -07:00
|
|
|
/* if (_e_menu_activate_time != 0) */
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_deactivate_all();
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (ret == -1)
|
|
|
|
_e_menu_deactivate_all();
|
2005-06-16 02:12:44 -07:00
|
|
|
else if (!_e_menu_activate_floating)
|
2005-05-03 01:29:26 -07:00
|
|
|
_e_menu_deactivate_all();
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Mouse_Move *ev;
|
2009-03-23 05:28:15 -07:00
|
|
|
Eina_List *l, *tmp;
|
|
|
|
E_Menu *m;
|
2004-11-24 19:37:45 -08:00
|
|
|
int dx, dy, d;
|
|
|
|
double dt;
|
|
|
|
double fast_move_threshold;
|
|
|
|
int is_fast = 0;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
2010-06-24 09:19:12 -07:00
|
|
|
if (ev->window != _e_menu_win) return ECORE_CALLBACK_PASS_ON;
|
2005-05-12 02:28:58 -07:00
|
|
|
fast_move_threshold = e_config->menus_fast_mouse_move_threshhold;
|
2004-11-24 19:37:45 -08:00
|
|
|
dx = ev->x - _e_menu_x;
|
|
|
|
dy = ev->y - _e_menu_y;
|
|
|
|
d = (dx * dx) + (dy * dy);
|
2009-03-16 09:24:43 -07:00
|
|
|
dt = (double)(ev->timestamp - _e_menu_time) / 1000.0;
|
2004-11-24 19:37:45 -08:00
|
|
|
dt = dt * dt;
|
|
|
|
if ((dt > 0.0) && ((d / dt) >= (fast_move_threshold * fast_move_threshold)))
|
|
|
|
is_fast = 1;
|
2006-08-22 01:38:24 -07:00
|
|
|
|
2009-03-23 05:28:15 -07:00
|
|
|
tmp = _e_active_menus_copy_ref();
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if ((m->realized) && (m->cur.visible))
|
|
|
|
{
|
|
|
|
if (is_fast)
|
|
|
|
m->fast_mouse = 1;
|
|
|
|
else if (dt > 0.0)
|
|
|
|
{
|
|
|
|
m->fast_mouse = 0;
|
|
|
|
if (m->pending_new_submenu)
|
|
|
|
{
|
|
|
|
E_Menu_Item *mi;
|
|
|
|
|
|
|
|
mi = _e_menu_item_active_get();
|
|
|
|
if (mi)
|
|
|
|
_e_menu_submenu_activate(mi);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
evas_event_feed_mouse_move(m->evas,
|
|
|
|
ev->x - m->cur.x + m->zone->x,
|
|
|
|
ev->y - m->cur.y + m->zone->y,
|
|
|
|
ev->timestamp, NULL);
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2009-03-23 05:28:15 -07:00
|
|
|
|
|
|
|
_e_menu_list_free_unref(tmp);
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_x = ev->x;
|
|
|
|
_e_menu_y = ev->y;
|
2009-03-16 09:24:43 -07:00
|
|
|
_e_menu_time = ev->timestamp;
|
2004-11-24 19:37:45 -08:00
|
|
|
_e_menu_mouse_autoscroll_check();
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Mouse_Wheel *ev;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
ev = event;
|
2010-06-24 09:19:12 -07:00
|
|
|
if (ev->window != _e_menu_win) return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
if (ev->z < 0) /* up */
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
int i;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
for (i = ev->z; i < 0; i++)
|
|
|
|
_e_menu_item_activate_previous();
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
else if (ev->z > 0) /* down */
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
int i;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
for (i = ev->z; i > 0; i--)
|
|
|
|
_e_menu_item_activate_next();
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_scroll_animator(void *data __UNUSED__)
|
2004-11-24 19:37:45 -08:00
|
|
|
{
|
|
|
|
double t, dt;
|
|
|
|
double dx, dy;
|
|
|
|
int out;
|
|
|
|
double spd;
|
2012-06-20 23:19:43 -07:00
|
|
|
|
2008-11-01 19:36:10 -07:00
|
|
|
t = ecore_loop_time_get();
|
2004-12-04 23:43:51 -08:00
|
|
|
spd = e_config->menus_scroll_speed;
|
2004-11-24 19:37:45 -08:00
|
|
|
dt = t - _e_menu_scroll_start;
|
|
|
|
_e_menu_scroll_start = t;
|
|
|
|
dx = 0;
|
|
|
|
dy = 0;
|
|
|
|
if (_e_menu_autoscroll_x)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
out = _e_menu_outside_bounds_get(_e_menu_autoscroll_x, 0);
|
|
|
|
dx = (-_e_menu_autoscroll_x) * spd * dt;
|
|
|
|
if (_e_menu_autoscroll_x == -1)
|
|
|
|
{
|
|
|
|
if (dx > out) dx = out;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (dx < -out) dx = -out;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
if (_e_menu_autoscroll_y)
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
out = _e_menu_outside_bounds_get(0, _e_menu_autoscroll_y);
|
|
|
|
dy = (-_e_menu_autoscroll_y) * spd * dt;
|
|
|
|
if (_e_menu_autoscroll_y == -1)
|
|
|
|
{
|
|
|
|
if (dy > out) dy = out;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (dy < -out) dy = -out;
|
|
|
|
}
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
_e_menu_scroll_by(dx, dy);
|
|
|
|
_e_menu_mouse_autoscroll_check();
|
|
|
|
if ((_e_menu_autoscroll_x == 0) && (_e_menu_autoscroll_y == 0))
|
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
_e_menu_scroll_animator = NULL;
|
|
|
|
return 0;
|
2004-11-24 19:37:45 -08:00
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
2005-04-13 08:52:34 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-11-05 11:40:31 -07:00
|
|
|
_e_menu_cb_window_shape(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
|
2005-04-13 08:52:34 -07:00
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2005-04-13 08:52:34 -07:00
|
|
|
Ecore_X_Event_Window_Shape *e;
|
2009-03-23 05:28:15 -07:00
|
|
|
E_Menu *m;
|
|
|
|
|
2005-04-13 08:52:34 -07:00
|
|
|
e = ev;
|
2009-03-23 05:28:15 -07:00
|
|
|
EINA_LIST_FOREACH(_e_active_menus, l, m)
|
2005-04-13 08:52:34 -07:00
|
|
|
{
|
2012-06-21 00:11:47 -07:00
|
|
|
if (m->evas_win == e->win)
|
|
|
|
m->need_shape_export = 1;
|
2005-04-13 08:52:34 -07:00
|
|
|
}
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2005-04-13 08:52:34 -07:00
|
|
|
}
|
2005-04-21 00:19:49 -07:00
|
|
|
|
|
|
|
static void
|
2010-08-18 10:29:26 -07:00
|
|
|
_e_menu_cb_item_submenu_post_default(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi)
|
2005-04-21 00:19:49 -07:00
|
|
|
{
|
|
|
|
E_Menu *subm;
|
|
|
|
|
|
|
|
if (!mi->submenu) return;
|
|
|
|
|
|
|
|
subm = mi->submenu;
|
2012-08-30 00:04:53 -07:00
|
|
|
e_menu_item_submenu_set(mi, NULL);
|
2005-04-21 00:19:49 -07:00
|
|
|
e_object_del(E_OBJECT(subm));
|
|
|
|
}
|
2006-01-06 15:45:13 -08:00
|
|
|
|
2009-06-17 06:46:54 -07:00
|
|
|
static Eina_Bool
|
2012-03-22 11:11:48 -07:00
|
|
|
_e_menu_categories_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
|
2006-01-06 15:45:13 -08:00
|
|
|
{
|
2009-06-17 06:46:54 -07:00
|
|
|
E_Menu_Category_Callback *cb;
|
2006-01-06 15:45:13 -08:00
|
|
|
E_Menu_Category *cat;
|
2008-12-17 07:33:43 -08:00
|
|
|
|
2012-06-21 00:11:47 -07:00
|
|
|
cat = (E_Menu_Category *)data;
|
2009-06-17 06:46:54 -07:00
|
|
|
EINA_LIST_FREE(cat->callbacks, cb)
|
2012-06-21 00:11:47 -07:00
|
|
|
free(cb); /* free the callback struct */
|
2006-01-06 15:45:13 -08:00
|
|
|
free(cat);
|
2009-06-17 06:46:54 -07:00
|
|
|
return EINA_TRUE;
|
2006-01-06 15:45:13 -08:00
|
|
|
}
|
2012-06-21 00:11:47 -07:00
|
|
|
|