1 #ifndef ELM_WIDGET_MENU_H 2 #define ELM_WIDGET_MENU_H 3 4 #include "Elementary.h" 5 6 #include "elm_menu_eo.h" 7 #include "elm_menu_item_eo.h" 8 #include "elm_hover_eo.h" 9 10 /* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR 11 * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT 12 * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK 13 * IT AT RUNTIME. 14 */ 15 16 /** 17 * @addtogroup Widget 18 * @{ 19 * 20 * @section elm-menu-class The Elementary Menu Class 21 * 22 * Elementary, besides having the @ref Menu widget, exposes its 23 * foundation -- the Elementary Menu Class -- in order to create 24 * other widgets which are a menu with some more logic on top. 25 */ 26 27 /** 28 * Base widget smart data extended with menu instance data. 29 */ 30 typedef struct _Elm_Menu_Data Elm_Menu_Data; 31 struct _Elm_Menu_Data 32 { 33 Evas_Object *hv, *bx, *location, *parent, *obj; 34 35 Eina_List *items; 36 Evas_Coord xloc, yloc; 37 Elm_DBus_Menu *dbus_menu; 38 39 Eina_Bool menu_bar : 1; 40 }; 41 42 typedef struct _Elm_Menu_Item_Data Elm_Menu_Item_Data; 43 struct _Elm_Menu_Item_Data 44 { 45 Elm_Widget_Item_Data *base; 46 47 Elm_Menu_Item_Data *parent; 48 Evas_Object *content; 49 const char *icon_str; 50 const char *label; 51 Evas_Smart_Cb func; 52 unsigned int idx; 53 Elm_DBus_Menu *dbus_menu; 54 int dbus_idx; 55 56 struct 57 { 58 Evas_Object *hv, *bx, *location; 59 Eina_List *items; 60 Eina_Bool open : 1; 61 } submenu; 62 63 Eina_Bool separator : 1; 64 Eina_Bool selected : 1; 65 Eina_Bool object_item : 1; 66 Eina_Bool was_enabled : 1; 67 Eina_Bool blocked : 1; 68 }; 69 70 /** 71 * @} 72 */ 73 74 #define ELM_MENU_DATA_GET(o, sd) \ 75 Elm_Menu_Data * sd = efl_data_scope_get(o, ELM_MENU_CLASS) 76 77 #define ELM_MENU_DATA_GET_OR_RETURN(o, ptr) \ 78 ELM_MENU_DATA_GET(o, ptr); \ 79 if (EINA_UNLIKELY(!ptr)) \ 80 { \ 81 ERR("No widget data for object %p (%s)", \ 82 o, evas_object_type_get(o)); \ 83 return; \ 84 } 85 86 #define ELM_MENU_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ 87 ELM_MENU_DATA_GET(o, ptr); \ 88 if (EINA_UNLIKELY(!ptr)) \ 89 { \ 90 ERR("No widget data for object %p (%s)", \ 91 o, evas_object_type_get(o)); \ 92 return val; \ 93 } 94 95 #define ELM_MENU_ITEM_DATA_GET(o, sd) \ 96 Elm_Menu_Item_Data *sd = efl_data_scope_get(o, ELM_MENU_ITEM_CLASS) 97 98 #define ELM_MENU_CHECK(obj) \ 99 if (EINA_UNLIKELY(!efl_isa((obj), ELM_MENU_CLASS))) \ 100 return 101 102 #define ELM_MENU_ITEM_CHECK(it) \ 103 if (EINA_UNLIKELY(!efl_isa((it->base->eo_obj), ELM_MENU_ITEM_CLASS))) \ 104 return 105 106 #define ELM_MENU_ITEM_CHECK_OR_RETURN(it, ...) \ 107 if (EINA_UNLIKELY(!efl_isa((it->base->eo_obj), ELM_MENU_ITEM_CLASS))) \ 108 return __VA_ARGS__; 109 110 111 #endif 112