update for beta release
[framework/uifw/e17.git] / src / bin / e_gadcon.h
1 #ifdef E_TYPEDEFS
2
3 #define E_GADCON_CLIENT(x) ((E_Gadcon_Client *)(x))
4
5 /* different layout policies - only 1 supported for now */
6 typedef enum _E_Gadcon_Layout_Policy
7 {
8    E_GADCON_LAYOUT_POLICY_PANEL
9 } E_Gadcon_Layout_Policy;
10
11 typedef enum _E_Gadcon_Orient
12 {
13    /* generic orientations */
14    E_GADCON_ORIENT_FLOAT,
15      E_GADCON_ORIENT_HORIZ,
16      E_GADCON_ORIENT_VERT,
17      E_GADCON_ORIENT_LEFT,
18      E_GADCON_ORIENT_RIGHT,
19      E_GADCON_ORIENT_TOP,
20      E_GADCON_ORIENT_BOTTOM,
21      E_GADCON_ORIENT_CORNER_TL,
22      E_GADCON_ORIENT_CORNER_TR,
23      E_GADCON_ORIENT_CORNER_BL,
24      E_GADCON_ORIENT_CORNER_BR,
25      E_GADCON_ORIENT_CORNER_LT,
26      E_GADCON_ORIENT_CORNER_RT,
27      E_GADCON_ORIENT_CORNER_LB,
28      E_GADCON_ORIENT_CORNER_RB
29 } E_Gadcon_Orient;
30
31 typedef enum _E_Gadcon_Site
32 {
33    E_GADCON_SITE_UNKNOWN = 0,        // when target site is unknown
34    /* generic sities */
35    E_GADCON_SITE_SHELF,
36    E_GADCON_SITE_DESKTOP,
37    E_GADCON_SITE_TOOLBAR,            // generic toolbar
38    E_GADCON_SITE_EFM_TOOLBAR         // filemanager window toolbar
39 } E_Gadcon_Site;
40
41 #define E_GADCON_CLIENT_STYLE_PLAIN "plain"
42 #define E_GADCON_CLIENT_STYLE_INSET "inset"
43
44 typedef struct _E_Gadcon E_Gadcon;
45 typedef struct _E_Gadcon_Client E_Gadcon_Client;
46 typedef struct _E_Gadcon_Client_Class E_Gadcon_Client_Class;
47 typedef struct _E_Gadcon_Location E_Gadcon_Location;
48
49 #else
50 #ifndef E_GADCON_H
51 #define E_GADCON_H
52
53 #define E_GADCON_TYPE 0xE0b01006
54 #define E_GADCON_CLIENT_TYPE 0xE0b01007
55
56 struct _E_Gadcon
57 {
58    E_Object e_obj_inherit;
59
60    const char *name;
61    int id;
62
63    E_Gadcon_Layout_Policy layout_policy;
64
65    struct 
66      {
67         Evas_Object *o_parent;
68         const char *swallow_name;
69      } edje;
70    Ecore_Evas *ecore_evas;
71    E_Zone *zone;
72
73    E_Gadcon_Orient orient;
74
75    Evas *evas;
76    Evas_Object *o_container;
77    Eina_List *clients;
78
79    struct 
80      {
81         void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
82         void *data;
83      } resize_request, min_size_request;
84    struct 
85      {
86         Evas_Object *(*func) (void *data, E_Gadcon_Client *gcc, const char *style);
87         void *data;
88      } frame_request;
89    struct 
90      {
91         void (*func) (void *data, E_Gadcon_Client *gcc, E_Menu *menu);
92         void *data;
93      } menu_attach;
94    struct 
95      {
96         void (*func) (void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc);
97         void *data;
98      } populate_class;
99    struct 
100      {
101         void (*func) (void *data, int lock);
102         void *data;
103      } locked_set;
104    struct 
105      {
106         void (*func) (void *data);
107         void *data;
108      } urgent_show;
109    
110    E_Config_Dialog *config_dialog;
111    unsigned char editing : 1;
112    Ecore_X_Window dnd_win, xdnd_win;
113    E_Shelf *shelf;
114    E_Toolbar *toolbar;
115    E_Gadcon_Location *location;
116
117    E_Drop_Handler *drop_handler;
118
119    E_Config_Gadcon *cf;
120
121    unsigned char instant_edit : 1;
122 };
123
124 #define GADCON_CLIENT_CLASS_VERSION 3
125 /* Version 3 add the *client_class param to icon(),label(),id_new(), id_del() */
126 /*           and the *orient param to orient() */
127 struct _E_Gadcon_Client_Class
128 {
129    int   version;
130    /* All members below are part of version 1 */
131    const char *name;
132    struct 
133      {
134         E_Gadcon_Client *(*init)     (E_Gadcon *gc, const char *name, const char *id, const char *style);
135         void             (*shutdown) (E_Gadcon_Client *gcc);
136         void             (*orient)   (E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
137         const char      *(*label)    (E_Gadcon_Client_Class *client_class);
138         Evas_Object     *(*icon)     (E_Gadcon_Client_Class *client_class, Evas *evas);
139         /* All members below are part of version 2 */
140         /* Create new id, so that the gadcon client can refer to a config set inside the module */
141         const char      *(*id_new)   (E_Gadcon_Client_Class *client_class);
142         /* Del an id when a gadcon client is removed from the system */
143         void             (*id_del)   (E_Gadcon_Client_Class *client_class, const char *id);
144         /* All members below are part of version 3 */
145         Eina_Bool        (*is_site)  (E_Gadcon_Site site);
146      } func;
147    char *default_style;
148 };
149
150 struct _E_Gadcon_Client
151 {
152    E_Object e_obj_inherit;
153    E_Gadcon *gadcon;
154    const char *name;
155    int id;
156    Evas_Object *o_base;
157    Evas_Object *o_box;
158    Evas_Object *o_frame;
159    Evas_Object *o_control;
160    Evas_Object *o_event;
161    const E_Gadcon_Client_Class *client_class;
162    void *data;
163
164    struct 
165      {
166         int pos, size, res;                 //gadcon
167         double pos_x, pos_y, size_w, size_h;   //gadman
168      } config; 
169
170    struct 
171      { 
172         int seq, flags; /* goes to save */
173         int state, resist;
174         int prev_pos, prev_size;
175         int want_save : 1;
176      } state_info;
177
178    struct 
179      {
180         Evas_Coord w, h;
181      } pad, min, aspect;
182
183    Ecore_Timer *scroll_timer;
184    Ecore_Timer *instant_edit_timer;
185    Ecore_Animator *scroll_animator;
186    double scroll_pos, scroll_wanted;
187
188    struct 
189      {
190         void *data;
191         void (*func) (void *data);
192      } scroll_cb;
193
194    E_Menu *menu;
195    const char *style;
196    unsigned char autoscroll : 1;
197    unsigned char resizable : 1;
198    unsigned char moving : 1;
199    unsigned char resizing : 1;
200    unsigned char autoscroll_set : 1;
201    Evas_Coord dx, dy;
202
203    struct 
204      {
205         int x, y;
206      } drag;
207
208    unsigned char hidden : 1;
209
210    E_Config_Gadcon_Client *cf;
211 };
212
213 /* defines usable gadget placements such as Desktop, Shelf #, etc */
214 /* next fields are mandatory (not NULL): name, add_gadget.func, remove_gadget.func */
215 struct _E_Gadcon_Location
216 {
217    /* location name */
218    const char * name;
219    /* icon related to location, such as "preferences-desktop-shelf" for shelves, "preferences-desktop" for menus */
220    const char * icon_name;
221    E_Gadcon_Site site;
222    /* adds gadcon client to location. Returns nonzero on success */
223    struct 
224      {
225         int (*func) (void *data, const E_Gadcon_Client_Class *cc);
226         void *data;
227      } gadget_add;
228    /* removes existing gadcon client from location */
229    struct 
230      {
231         void (*func) (void *data, E_Gadcon_Client *gcc);
232         void *data;
233      } gadget_remove;
234 };
235
236 EINTERN int              e_gadcon_init(void);
237 EINTERN int              e_gadcon_shutdown(void);
238 EAPI void             e_gadcon_provider_register(const E_Gadcon_Client_Class *cc);
239 EAPI void             e_gadcon_provider_unregister(const E_Gadcon_Client_Class *cc);
240 EAPI Eina_List       *e_gadcon_provider_list(void);
241 EAPI E_Gadcon        *e_gadcon_swallowed_new(const char *name, int id, Evas_Object *obj, const char *swallow_name);
242 EAPI void             e_gadcon_custom_new(E_Gadcon *gc);
243 EAPI void             e_gadcon_custom_del(E_Gadcon *gc);
244 EAPI void             e_gadcon_swallowed_min_size_set(E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
245 EAPI void             e_gadcon_min_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h), void *data);
246 EAPI void             e_gadcon_size_request_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h), void *data);
247 EAPI void             e_gadcon_frame_request_callback_set(E_Gadcon *gc, Evas_Object *(*func) (void *data, E_Gadcon_Client *gcc, const char *style), void *data);
248 EAPI void             e_gadcon_populate_callback_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc), void *data);
249 EAPI void             e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy);
250 EAPI void             e_gadcon_populate(E_Gadcon *gc);
251 EAPI void             e_gadcon_unpopulate(E_Gadcon *gc);
252 EAPI void             e_gadcon_populate_class(E_Gadcon *gc, const E_Gadcon_Client_Class *cc);
253 EAPI void             e_gadcon_orient(E_Gadcon *gc, E_Gadcon_Orient orient);
254 EAPI void             e_gadcon_edit_begin(E_Gadcon *gc);
255 EAPI void             e_gadcon_edit_end(E_Gadcon *gc);
256 EAPI void             e_gadcon_all_edit_begin(void);
257 EAPI void             e_gadcon_all_edit_end(void);
258 EAPI void             e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone);
259 EAPI E_Zone          *e_gadcon_zone_get(E_Gadcon *gc);
260 EAPI void             e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee);
261 EAPI int              e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h);
262 EAPI void             e_gadcon_util_menu_attach_func_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon_Client *gcc, E_Menu *menu), void *data);
263 EAPI void             e_gadcon_util_lock_func_set(E_Gadcon *gc, void (*func) (void *data, int lock), void *data);
264 EAPI void             e_gadcon_util_urgent_show_func_set(E_Gadcon *gc, void (*func) (void *data), void *data);
265 EAPI void             e_gadcon_dnd_window_set(E_Gadcon *gc, Ecore_X_Window win);
266 EAPI Ecore_X_Window   e_gadcon_dnd_window_get(E_Gadcon *gc);
267 EAPI void             e_gadcon_xdnd_window_set(E_Gadcon *gc, Ecore_X_Window win);
268 EAPI Ecore_X_Window   e_gadcon_xdnd_window_get(E_Gadcon *gc);
269 EAPI void             e_gadcon_shelf_set(E_Gadcon *gc, E_Shelf *shelf);
270 EAPI E_Shelf         *e_gadcon_shelf_get(E_Gadcon *gc);
271 EAPI void             e_gadcon_toolbar_set(E_Gadcon *gc, E_Toolbar *toolbar);
272 EAPI E_Toolbar       *e_gadcon_toolbar_get(E_Gadcon *gc);
273 EAPI E_Config_Gadcon_Client *e_gadcon_client_config_new(E_Gadcon *gc, const char *name);
274 EAPI void             e_gadcon_client_config_del(E_Config_Gadcon *cf_gc, E_Config_Gadcon_Client *cf_gcc);
275 EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id, const char *style, Evas_Object *base_obj);
276 EAPI void             e_gadcon_client_edit_begin(E_Gadcon_Client *gcc);
277 EAPI void             e_gadcon_client_edit_end(E_Gadcon_Client *gcc);
278 EAPI void             e_gadcon_client_show(E_Gadcon_Client *gcc);
279 EAPI void             e_gadcon_client_hide(E_Gadcon_Client *gcc);
280 EAPI void             e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
281 EAPI void             e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
282 EAPI void             e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
283 EAPI void             e_gadcon_client_autoscroll_set(E_Gadcon_Client *gcc, int autoscroll);
284 EAPI void             e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, int mx, int my);
285 EAPI void             e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data);
286 EAPI void             e_gadcon_client_resizable_set(E_Gadcon_Client *gcc, int resizable);
287 EAPI int              e_gadcon_client_geometry_get(E_Gadcon_Client *gcc, int *x, int *y, int *w, int *h);
288 EAPI int              e_gadcon_client_viewport_geometry_get(E_Gadcon_Client *gcc, int *x, int *y, int *w, int *h);
289 EAPI E_Zone          *e_gadcon_client_zone_get(E_Gadcon_Client *gcc);
290 EAPI E_Menu          *e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu_gadget, int flags);
291 EAPI void             e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc);
292 EAPI void             e_gadcon_locked_set(E_Gadcon *gc, int lock);
293 EAPI void             e_gadcon_urgent_show(E_Gadcon *gc);
294
295 /* site helpers */
296
297 EAPI Eina_Bool        e_gadcon_site_is_shelf(E_Gadcon_Site site);
298 EAPI Eina_Bool        e_gadcon_site_is_desktop(E_Gadcon_Site site);
299 EAPI Eina_Bool        e_gadcon_site_is_efm_toolbar(E_Gadcon_Site site);
300
301 EAPI Eina_Bool        e_gadcon_site_is_any_toolbar(E_Gadcon_Site site); // all toolbar sities
302 EAPI Eina_Bool        e_gadcon_site_is_not_toolbar(E_Gadcon_Site site); // all non-toolbar sities
303
304 /* location helpers */
305
306 EAPI E_Gadcon_Location *
307 e_gadcon_location_new(const char * name, E_Gadcon_Site site,
308                        int (*add_func) (void *data, const E_Gadcon_Client_Class *cc),
309                        void *add_data,
310                        void (*remove_func) (void *data, E_Gadcon_Client *cc),
311                        void *remove_data);
312 EAPI void e_gadcon_location_free(E_Gadcon_Location *loc);
313 EAPI void e_gadcon_location_register (E_Gadcon_Location *loc);
314 EAPI void e_gadcon_location_unregister (E_Gadcon_Location *loc);
315 EAPI void e_gadcon_location_set_icon_name(E_Gadcon_Location *loc, const char *name);
316 EAPI void e_gadcon_client_add_location_menu(E_Gadcon_Client *gcc, E_Menu *menu);
317
318 #define GADCON_CLIENT_CONFIG_GET(_type, _items, _gc_class, _id)         \
319   if (!_id)                                                             \
320     {                                                                   \
321        char buf[128];                                                   \
322        int num = 0;                                                     \
323        _type *ci;                                                       \
324        if (_items)                                                      \
325          {                                                              \
326             const char *p;                                              \
327             ci = eina_list_last(_items)->data;                          \
328             p = strrchr (ci->id, '.');                                  \
329             if (p) num = atoi (p + 1) + 1;                              \
330          }                                                              \
331        snprintf (buf, sizeof (buf), "%s.%d", _gc_class.name, num);      \
332        _id = buf;                                                       \
333     }                                                                   \
334   else                                                                  \
335     {                                                                   \
336        Eina_List *l;                                                    \
337        _type *ci;                                                       \
338        EINA_LIST_FOREACH(_items, l, ci)                                 \
339          if ((ci->id) && (!strcmp(ci->id, id))) return ci;              \
340     }
341
342 #endif
343 #endif