[WM_ROT] Fixed floating mode window rotation bug that window doesn't send ROTATION_DO...
[platform/core/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 = 0,
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_LAST
30 } E_Gadcon_Orient;
31
32 typedef enum _E_Gadcon_Site
33 {
34    E_GADCON_SITE_UNKNOWN = 0, // when target site is unknown
35    /* generic sities */
36    E_GADCON_SITE_SHELF,
37    E_GADCON_SITE_DESKTOP,
38    E_GADCON_SITE_TOOLBAR, // generic toolbar
39    E_GADCON_SITE_EFM_TOOLBAR // filemanager window toolbar
40 } E_Gadcon_Site;
41
42 #define E_GADCON_CLIENT_STYLE_PLAIN "plain"
43 #define E_GADCON_CLIENT_STYLE_INSET "inset"
44
45 typedef struct _E_Gadcon              E_Gadcon;
46 typedef struct _E_Gadcon_Client       E_Gadcon_Client;
47 typedef struct _E_Event_Gadcon_Client       E_Event_Gadcon_Client_Add;
48 typedef struct _E_Event_Gadcon_Client       E_Event_Gadcon_Client_Del;
49 typedef struct _E_Gadcon_Client_Class E_Gadcon_Client_Class;
50 typedef struct _E_Event_Gadcon_Client_Class E_Event_Gadcon_Client_Class_Add;
51 typedef struct _E_Event_Gadcon_Client_Class E_Event_Gadcon_Client_Class_Del;
52 typedef struct _E_Gadcon_Location     E_Gadcon_Location;
53
54 #else
55 #ifndef E_GADCON_H
56 #define E_GADCON_H
57
58 #define E_GADCON_TYPE        0xE0b01006
59 #define E_GADCON_DUMMY_TYPE  0xE0b01016
60 #define E_GADCON_CLIENT_TYPE 0xE0b01007
61
62 EAPI extern int E_EVENT_GADCON_CLIENT_ADD;
63 EAPI extern int E_EVENT_GADCON_CLIENT_DEL;
64 EAPI extern int E_EVENT_GADCON_CLIENT_CLASS_ADD;
65 EAPI extern int E_EVENT_GADCON_CLIENT_CLASS_DEL;
66
67 struct _E_Gadcon
68 {
69    E_Object               e_obj_inherit;
70
71    const char            *name;
72    int                    id;
73
74    E_Gadcon_Layout_Policy layout_policy;
75
76    struct
77    {
78       Evas_Object *o_parent;
79       const char  *swallow_name;
80    } edje;
81    Ecore_Evas            *ecore_evas;
82    E_Zone                *zone;
83
84    E_Gadcon_Orient        orient;
85
86    Evas                  *evas;
87    Evas_Object           *o_container;
88    Eina_List             *clients;
89    Eina_List             *populate_requests;
90    Eina_List             *populated_classes;
91    Eina_Hash             *awaiting_classes; /* E_Config_Gadcon_Client */
92
93    struct
94    {
95       void  (*func)(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
96       void *data;
97    } resize_request, min_size_request;
98    struct
99    {
100       Evas_Object *(*func)(void *data, E_Gadcon_Client * gcc, const char *style);
101       void        *data;
102    } frame_request;
103    struct
104    {
105       void  (*func)(void *data, E_Gadcon_Client *gcc, E_Menu *menu);
106       void *data;
107    } menu_attach;
108    struct
109    {
110       void  (*func)(void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc);
111       void *data;
112    } populate_class;
113    struct
114    {
115       void  (*func)(void *data, int lock);
116       void *data;
117    } locked_set;
118    struct
119    {
120       void  (*func)(void *data);
121       void *data;
122    } urgent_show;
123
124    E_Config_Dialog   *config_dialog;
125    unsigned char      editing : 1;
126    Ecore_X_Window     dnd_win, xdnd_win;
127    E_Shelf           *shelf;
128    E_Toolbar         *toolbar;
129    E_Gadcon_Location *location;
130
131    E_Drop_Handler    *drop_handler;
132    E_Gadcon_Client *drag_gcc, *new_gcc;
133
134    E_Config_Gadcon   *cf;
135
136    unsigned char      instant_edit : 1;
137    unsigned char      dummy : 1;
138    Eina_Bool          custom : 1;
139    Eina_Bool          cfg_delete : 1;
140 };
141
142 #define GADCON_CLIENT_CLASS_VERSION 3
143 /* Version 3 add the *client_class param to icon(),label(),id_new(), id_del() */
144 /*           and the *orient param to orient() */
145 struct _E_Gadcon_Client_Class
146 {
147    int         version;
148    /* All members below are part of version 1 */
149    const char *name;
150    struct
151    {
152       E_Gadcon_Client *(*init)(E_Gadcon * gc, const char *name, const char *id, const char *style);
153       void             (*shutdown)(E_Gadcon_Client *gcc);
154       void             (*orient)(E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
155       const char      *(*label)(const E_Gadcon_Client_Class *client_class);
156       Evas_Object     *(*icon)(const E_Gadcon_Client_Class *client_class, Evas * evas);
157       /* All members below are part of version 2 */
158       /* Create new id, so that the gadcon client can refer to a config set inside the module */
159       const char      *(*id_new)(const E_Gadcon_Client_Class *client_class);
160       /* Del an id when a gadcon client is removed from the system */
161       void             (*id_del)(const E_Gadcon_Client_Class *client_class, const char *id);
162       /* All members below are part of version 3 */
163       Eina_Bool        (*is_site)(E_Gadcon_Site site);
164    } func;
165    const char *default_style;
166 };
167
168 struct _E_Gadcon_Client
169 {
170    E_Object                     e_obj_inherit;
171    E_Gadcon                    *gadcon;
172    const char                  *name;
173    int                          id;
174    Evas_Object                 *o_base;
175    Evas_Object                 *o_box;
176    Evas_Object                 *o_frame;
177    Evas_Object                 *o_control;
178    Evas_Object                 *o_event;
179    const E_Gadcon_Client_Class *client_class;
180    void                        *data;
181
182    struct
183    {
184       int    pos, size, res; //gadcon
185       double pos_x, pos_y, size_w, size_h;     //gadman
186    } config;
187
188    struct
189    {
190       int seq, flags;   /* goes to save */
191       int state, resist;
192       int prev_pos, prev_size;
193       int want_save : 1;
194    } state_info;
195
196    struct
197    {
198       Evas_Coord w, h;
199    } pad, min, aspect;
200
201    Ecore_Timer            *scroll_timer;
202    Ecore_Timer            *instant_edit_timer;
203    Ecore_Animator         *scroll_animator;
204    double                  scroll_pos, scroll_wanted;
205
206    struct
207    {
208       void *data;
209       void  (*func)(void *data);
210    } scroll_cb;
211
212    E_Menu                 *menu;
213    const char             *style;
214    unsigned char           autoscroll : 1;
215    unsigned char           resizable : 1;
216    unsigned char           moving : 1;
217    unsigned char           resizing : 1;
218    unsigned char           autoscroll_set : 1;
219    unsigned char           autoscroll_disabled : 1;
220    Evas_Coord              dx, dy;
221
222    struct
223    {
224       int x, y;
225       E_Drag *drag;
226    } drag;
227
228    unsigned char           hidden : 1;
229
230    E_Config_Gadcon_Client *cf;
231 };
232
233 struct _E_Event_Gadcon_Client_Class
234 {
235    const E_Gadcon_Client_Class *cc;
236 };
237
238 struct _E_Event_Gadcon_Client
239 {
240    E_Gadcon_Client *gcc;
241 };
242
243 /* defines usable gadget placements such as Desktop, Shelf #, etc */
244 /* next fields are mandatory (not NULL): name, add_gadget.func, remove_gadget.func */
245 struct _E_Gadcon_Location
246 {
247    /* location name */
248    const char   *name;
249    /* icon related to location, such as "preferences-desktop-shelf" for shelves, "preferences-desktop" for menus */
250    const char   *icon_name;
251    E_Gadcon_Site site;
252    /* adds gadcon client to location. Returns nonzero on success */
253    struct
254    {
255       int   (*func)(void *data, const E_Gadcon_Client_Class *cc);
256       void *data;
257    } gadget_add;
258    /* removes existing gadcon client from location */
259    struct
260    {
261       void  (*func)(void *data, E_Gadcon_Client *gcc);
262       void *data;
263    } gadget_remove;
264 };
265
266 EINTERN int                  e_gadcon_init(void);
267 EINTERN int                  e_gadcon_shutdown(void);
268 EAPI void                    e_gadcon_provider_register(const E_Gadcon_Client_Class *cc);
269 EAPI void                    e_gadcon_provider_unregister(const E_Gadcon_Client_Class *cc);
270 EAPI Eina_List              *e_gadcon_provider_list(void);
271 EAPI E_Gadcon               *e_gadcon_dummy_new(int id);
272 EAPI void                     e_gadcon_drop_handler_add(E_Gadcon *gc, int x, int y, int w, int h);
273 EAPI void                    e_gadcon_config_del(E_Gadcon *gc);
274 EAPI E_Gadcon               *e_gadcon_swallowed_new(const char *name, int id, Evas_Object *obj, const char *swallow_name);
275 EAPI void                    e_gadcon_custom_new(E_Gadcon *gc);
276 EAPI void                    e_gadcon_custom_del(E_Gadcon *gc);
277 EAPI void                    e_gadcon_custom_populate_request(E_Gadcon *gc);
278 EAPI void                    e_gadcon_swallowed_min_size_set(E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
279 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);
280 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);
281 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);
282 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);
283 EAPI void                    e_gadcon_layout_policy_set(E_Gadcon *gc, E_Gadcon_Layout_Policy layout_policy);
284 EAPI Eina_Bool               e_gadcon_populate(E_Gadcon *gc);
285 EAPI void                    e_gadcon_unpopulate(E_Gadcon *gc);
286 EAPI void                    e_gadcon_populate_class(E_Gadcon *gc, const E_Gadcon_Client_Class *cc);
287 EAPI void                    e_gadcon_orient(E_Gadcon *gc, E_Gadcon_Orient orient);
288 EAPI void                    e_gadcon_edit_begin(E_Gadcon *gc);
289 EAPI void                    e_gadcon_edit_end(E_Gadcon *gc);
290 EAPI void                    e_gadcon_all_edit_begin(void);
291 EAPI void                    e_gadcon_all_edit_end(void);
292 EAPI void                    e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone);
293 EAPI E_Zone                 *e_gadcon_zone_get(E_Gadcon *gc);
294 EAPI void                    e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee);
295 EAPI int                     e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h);
296 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);
297 EAPI void                    e_gadcon_util_lock_func_set(E_Gadcon *gc, void (*func)(void *data, int lock), void *data);
298 EAPI void                    e_gadcon_util_urgent_show_func_set(E_Gadcon *gc, void (*func)(void *data), void *data);
299 EAPI void                    e_gadcon_dnd_window_set(E_Gadcon *gc, Ecore_X_Window win);
300 EAPI Ecore_X_Window          e_gadcon_dnd_window_get(E_Gadcon *gc);
301 EAPI void                    e_gadcon_xdnd_window_set(E_Gadcon *gc, Ecore_X_Window win);
302 EAPI Ecore_X_Window          e_gadcon_xdnd_window_get(E_Gadcon *gc);
303 EAPI void                    e_gadcon_shelf_set(E_Gadcon *gc, E_Shelf *shelf);
304 EAPI E_Shelf                *e_gadcon_shelf_get(E_Gadcon *gc);
305 EAPI void                    e_gadcon_toolbar_set(E_Gadcon *gc, E_Toolbar *toolbar);
306 EAPI E_Toolbar              *e_gadcon_toolbar_get(E_Gadcon *gc);
307 EAPI E_Gadcon_Client      *e_gadcon_client_find(E_Gadcon *gc, E_Config_Gadcon_Client *cf_gcc);
308 EAPI E_Config_Gadcon_Client *e_gadcon_client_config_new(E_Gadcon *gc, const char *name);
309 EAPI void                    e_gadcon_client_config_del(E_Config_Gadcon *cf_gc, E_Config_Gadcon_Client *cf_gcc);
310 EAPI E_Gadcon_Client        *e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id, const char *style, Evas_Object *base_obj);
311 EAPI void                    e_gadcon_client_edit_begin(E_Gadcon_Client *gcc);
312 EAPI void                    e_gadcon_client_edit_end(E_Gadcon_Client *gcc);
313 EAPI void                    e_gadcon_client_queue(E_Gadcon *gc, E_Config_Gadcon_Client *cf_gcc);
314 EAPI void                    e_gadcon_client_show(E_Gadcon_Client *gcc);
315 EAPI void                    e_gadcon_client_hide(E_Gadcon_Client *gcc);
316 EAPI void                    e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
317 EAPI void                    e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
318 EAPI void                    e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
319 EAPI void                    e_gadcon_client_autoscroll_toggle_disabled_set(E_Gadcon_Client *gcc, Eina_Bool disable);
320 EAPI void                    e_gadcon_client_autoscroll_set(E_Gadcon_Client *gcc, int autoscroll);
321 EAPI void                    e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, int mx, int my);
322 EAPI void                    e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data);
323 EAPI void                    e_gadcon_client_resizable_set(E_Gadcon_Client *gcc, int resizable);
324 EAPI int                     e_gadcon_client_geometry_get(E_Gadcon_Client *gcc, int *x, int *y, int *w, int *h);
325 EAPI int                     e_gadcon_client_viewport_geometry_get(E_Gadcon_Client *gcc, int *x, int *y, int *w, int *h);
326 EAPI E_Zone                 *e_gadcon_client_zone_get(E_Gadcon_Client *gcc);
327 EAPI E_Menu                *e_gadcon_client_menu_set(E_Gadcon_Client *gcc, E_Menu *m);
328 EAPI E_Menu                 *e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu_gadget, int flags);
329 EAPI void                    e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc);
330 EAPI void                    e_gadcon_locked_set(E_Gadcon *gc, int lock);
331 EAPI void                    e_gadcon_urgent_show(E_Gadcon *gc);
332 EAPI void                    e_gadcon_name_set(E_Gadcon *gc, const char *name);
333
334 /* site helpers */
335
336 EAPI Eina_Bool               e_gadcon_site_is_shelf(E_Gadcon_Site site);
337 EAPI Eina_Bool               e_gadcon_site_is_desktop(E_Gadcon_Site site);
338 EAPI Eina_Bool               e_gadcon_site_is_efm_toolbar(E_Gadcon_Site site);
339
340 EAPI Eina_Bool               e_gadcon_site_is_any_toolbar(E_Gadcon_Site site); // all toolbar sities
341 EAPI Eina_Bool               e_gadcon_site_is_not_toolbar(E_Gadcon_Site site); // all non-toolbar sities
342
343 /* location helpers */
344
345 EAPI E_Gadcon_Location *
346                              e_gadcon_location_new(const char *name, E_Gadcon_Site site,
347                       int (*add_func)(void *data, const E_Gadcon_Client_Class *cc),
348                       void *add_data,
349                       void (*remove_func)(void *data, E_Gadcon_Client *cc),
350                       void *remove_data);
351 EAPI void                    e_gadcon_location_free(E_Gadcon_Location *loc);
352 EAPI void                    e_gadcon_location_register(E_Gadcon_Location *loc);
353 EAPI void                    e_gadcon_location_unregister(E_Gadcon_Location *loc);
354 EAPI void                    e_gadcon_location_set_icon_name(E_Gadcon_Location *loc, const char *name);
355 EAPI void                    e_gadcon_client_add_location_menu(E_Gadcon_Client *gcc, E_Menu *menu);
356 EAPI void                    e_gadcon_drag_finished_cb(E_Drag *drag, int dropped);
357 EAPI void                    e_gadcon_client_drag_set(E_Gadcon_Client *gcc);
358
359 #define GADCON_CLIENT_CONFIG_GET(_type, _items, _gc_class, _id)                             \
360   if (!_id)                                                                                 \
361     {                                                                                       \
362        char *_buf;                                                                          \
363        int _num = 0;                                                                        \
364        _type *_ci;                                                                          \
365        if (_items)                                                                          \
366          {                                                                                  \
367             const char *_p;                                                                 \
368             _ci = eina_list_last(_items)->data;                                             \
369             _p = strrchr(_ci->id, '.');                                                     \
370             if (_p) _num = atoi(_p + 1) + 1;                                                \
371          }                                                                                  \
372        _buf = alloca(sizeof (char) * ((_gc_class.name ? strlen(_gc_class.name) : 6) + 11)); \
373        sprintf(_buf, "%s.%d", _gc_class.name, _num);                                        \
374        _id = _buf;                                                                          \
375     }                                                                                       \
376   else                                                                                      \
377     {                                                                                       \
378        Eina_List *l;                                                                        \
379        _type *_ci;                                                                          \
380        EINA_LIST_FOREACH(_items, l, _ci)                                                   \
381          if ((_ci->id) && (!strcmp(_ci->id, _id))) return _ci;                              \
382     }
383
384 #endif
385 #endif