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