456efe03cfe350cb6ffb97830afcc3fe24054116
[platform/upstream/enlightenment.git] / src / modules / everything / evry_gadget.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 typedef struct _Instance Instance;
5
6 struct _Instance
7 {
8    EINA_INLIST;
9
10    E_Gadcon_Client *gcc;
11    Evas_Object     *o_button;
12
13    Evry_Window     *win;
14    Gadget_Config   *cfg;
15    E_Config_Dialog *cfd;
16
17    int              mouse_down;
18
19    double           hide_start;
20    int              hide_x, hide_y;
21
22    Eina_List       *handlers;
23
24    Eina_Bool        hidden;
25    Eina_Bool        animating;
26    Eina_Bool        illume_mode;
27 };
28
29 /* static void _button_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); */
30 static void             _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
31 static Eina_Bool        _cb_focus_out(void *data, int type __UNUSED__, void *event);
32 static void _del_func(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
33
34 /* gadcon requirements */
35 static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style);
36 static void             _gc_shutdown(E_Gadcon_Client *gcc);
37 static void             _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient);
38 static const char      *_gc_label(const E_Gadcon_Client_Class *client_class);
39 static Evas_Object     *_gc_icon(const E_Gadcon_Client_Class *client_class, Evas *evas);
40 static const char      *_gc_id_new(const E_Gadcon_Client_Class *client_class);
41 static Gadget_Config   *_conf_item_get(const char *id);
42
43 static void             _conf_dialog(Instance *inst);
44 static Eina_Inlist *instances = NULL;
45
46 static const E_Gadcon_Client_Class _gadcon_class =
47 {
48    GADCON_CLIENT_CLASS_VERSION,
49    "evry-starter",
50    {
51       _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL,
52       e_gadcon_site_is_not_toolbar
53    },
54    E_GADCON_CLIENT_STYLE_PLAIN
55 };
56
57 static Eina_Bool
58 _illume_running(void)
59 {
60    /* hack to find out out if illume is running, dont grab if
61       this is the case... */
62
63    Eina_List *l;
64    E_Module *m;
65
66    EINA_LIST_FOREACH (e_module_list(), l, m)
67      if (!strcmp(m->name, "illume2") && m->enabled)
68        return EINA_TRUE;
69
70    return EINA_FALSE;
71 }
72
73 static E_Gadcon_Client *
74 _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
75 {
76    Evas_Object *o;
77    E_Gadcon_Client *gcc;
78    Instance *inst;
79    Evry_Plugin *p;
80
81    inst = E_NEW(Instance, 1);
82    inst->cfg = _conf_item_get(id);
83
84    o = edje_object_add(gc->evas);
85    e_theme_edje_object_set(o, "base/theme/modules/everything", "e/modules/everything/gadget");
86
87    if (((inst->cfg->plugin) && (strcmp(inst->cfg->plugin, "Start") != 0)) &&
88        (p = evry_plugin_find(inst->cfg->plugin)))
89      {
90         Evas_Object *oo = evry_util_icon_get(EVRY_ITEM(p), gc->evas);
91         if (oo)
92           {
93              edje_object_part_swallow(o, "e.swallow.icon", oo);
94              edje_object_signal_emit(o, "e,state,icon,plugin", "e");
95           }
96      }
97
98    edje_object_signal_emit(o, "e,state,unfocused", "e");
99
100    gcc = e_gadcon_client_new(gc, name, id, style, o);
101    gcc->data = inst;
102
103    inst->gcc = gcc;
104    inst->o_button = o;
105
106    /* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
107     *           _button_cb_mouse_up, inst); */
108
109    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
110                                   _button_cb_mouse_down, inst);
111
112    if (_illume_running())
113      {
114         inst->illume_mode = EINA_TRUE;
115
116         inst->handlers = eina_list_append(inst->handlers,
117                                           ecore_event_handler_add(E_EVENT_CLIENT_FOCUS_OUT,
118                                                                   _cb_focus_out, inst));
119      }
120
121    instances = eina_inlist_append(instances, EINA_INLIST_GET(inst));
122
123    return gcc;
124 }
125
126 static void
127 _gc_shutdown(E_Gadcon_Client *gcc)
128 {
129    Instance *inst;
130    Ecore_Event_Handler *h;
131
132    inst = gcc->data;
133
134    instances = eina_inlist_remove(instances, EINA_INLIST_GET(inst));
135
136    EINA_LIST_FREE (inst->handlers, h)
137      ecore_event_handler_del(h);
138
139    if (inst->win)
140      {
141         evas_object_event_callback_del(inst->win->ewin, EVAS_CALLBACK_DEL, _del_func);
142         evry_hide(inst->win, 0);
143      }
144
145    evas_object_del(inst->o_button);
146    free(inst);
147 }
148
149 static void
150 _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__)
151 {
152    Instance *inst;
153    Evas_Coord mw, mh;
154
155    inst = gcc->data;
156    mw = 0, mh = 0;
157    edje_object_size_min_get(inst->o_button, &mw, &mh);
158    if ((mw < 1) || (mh < 1))
159      edje_object_size_min_calc(inst->o_button, &mw, &mh);
160    if (mw < 4) mw = 4;
161    if (mh < 4) mh = 4;
162    e_gadcon_client_aspect_set(gcc, mw, mh);
163    e_gadcon_client_min_size_set(gcc, mw, mh);
164 }
165
166 static const char *
167 _gc_label(const E_Gadcon_Client_Class *client_class __UNUSED__)
168 {
169    return _("Everything Starter");
170 }
171
172 static Evas_Object *
173 _gc_icon(const E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas __UNUSED__)
174 {
175    Evas_Object *o;
176    char buf[PATH_MAX];
177
178    o = edje_object_add(evas);
179    snprintf(buf, sizeof(buf), "%s/e-module-everything-start.edj",
180             e_module_dir_get(_mod_evry));
181    edje_object_file_set(o, buf, "icon");
182    return o;
183 }
184
185 static Gadget_Config *
186 _conf_item_get(const char *id)
187 {
188    Gadget_Config *ci;
189
190    GADCON_CLIENT_CONFIG_GET(Gadget_Config, evry_conf->gadgets, _gadcon_class, id);
191
192    ci = E_NEW(Gadget_Config, 1);
193    ci->id = eina_stringshare_add(id);
194
195    evry_conf->gadgets = eina_list_append(evry_conf->gadgets, ci);
196
197    e_config_save_queue();
198
199    return ci;
200 }
201
202 static const char *
203 _gc_id_new(const E_Gadcon_Client_Class *client_class __UNUSED__)
204 {
205    Gadget_Config *ci = NULL;
206
207    ci = _conf_item_get(NULL);
208    return ci->id;
209 }
210
211 /***************************************************************************/
212
213 static void
214 _del_func(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
215 {
216    Instance *inst = data;
217
218    e_gadcon_locked_set(inst->gcc->gadcon, 0);
219
220    inst->win = NULL;
221    edje_object_signal_emit(inst->o_button, "e,state,unfocused", "e");
222 }
223
224 static void
225 _cb_menu_configure(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
226 {
227    _conf_dialog(data);
228 }
229
230 static void
231 _hide_done(void *data, Evas_Object *obj EINA_UNUSED, const char *s EINA_UNUSED, const char *ss EINA_UNUSED)
232 {
233    Instance *inst = data;
234    E_Client *ec;
235
236    /* go bac to subject selector */
237    evry_selectors_switch(inst->win, -1, 0);
238    evry_selectors_switch(inst->win, -1, 0);
239
240    ec = e_win_client_get(inst->win->ewin);
241    e_client_iconify(ec);
242    e_comp_object_effect_set(ec->frame, "none");
243    inst->animating = 0;
244 }
245
246 static void
247 _evry_hide_func(Evry_Window *win, int finished __UNUSED__)
248 {
249    Instance *inst = win->data;
250    E_Client *ec;
251    int x, y, w, h;
252
253    ec = e_win_client_get(inst->win->ewin);;
254    e_comp_object_effect_set(ec->frame, "pane");
255    /* set geoms */
256    evas_object_geometry_get(inst->win->ewin, &x, &y, &w, &h);
257    e_comp_object_effect_params_set(ec->frame, 1,
258      (int[]){x, y, w, h,
259              ec->zone->w, ec->zone->h,
260              inst->hide_x, inst->hide_y}, 8);
261    e_comp_object_effect_params_set(ec->frame, 0, (int[]){0}, 1);
262    e_comp_object_effect_start(ec->frame, _hide_done, inst);
263    inst->hidden = inst->animating = EINA_TRUE;
264 }
265
266 static Eina_Bool
267 _cb_focus_out(void *data, int type __UNUSED__, void *event)
268 {
269    E_Event_Client *ev;
270    Instance *inst;
271
272    ev = event;
273
274    EINA_INLIST_FOREACH (instances, inst)
275      if (inst == data) break;
276
277    if ((!inst) || (!inst->win))
278      return ECORE_CALLBACK_PASS_ON;
279
280    if (e_win_client_get(inst->win->ewin) != ev->ec)
281      return ECORE_CALLBACK_PASS_ON;
282
283    _evry_hide_func(inst->win, 0);
284
285    return ECORE_CALLBACK_PASS_ON;
286 }
287
288 static void
289 _gadget_popup_show(Instance *inst)
290 {
291    Evas_Coord x, y, w, h;
292    int cx, cy, px, py, pw, ph;
293    Evas_Object *ewin = inst->win->ewin;
294
295    evas_object_geometry_get(ewin, &px, &py, &pw, &ph);
296
297    evas_object_geometry_get(inst->o_button, &x, &y, &w, &h);
298    e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, NULL, NULL);
299    x += cx;
300    y += cy;
301
302    switch (inst->gcc->gadcon->orient)
303      {
304       case E_GADCON_ORIENT_TOP:
305       case E_GADCON_ORIENT_CORNER_TL:
306       case E_GADCON_ORIENT_CORNER_TR:
307         y += h;
308         inst->hide_y = -1;
309         break;
310
311       case E_GADCON_ORIENT_BOTTOM:
312       case E_GADCON_ORIENT_CORNER_BR:
313       case E_GADCON_ORIENT_CORNER_BL:
314         y -= ph;
315         inst->hide_y = 1;
316         break;
317
318       case E_GADCON_ORIENT_LEFT:
319       case E_GADCON_ORIENT_CORNER_LT:
320       case E_GADCON_ORIENT_CORNER_LB:
321         x += w;
322         inst->hide_x = -1;
323         break;
324
325       case E_GADCON_ORIENT_RIGHT:
326       case E_GADCON_ORIENT_CORNER_RT:
327       case E_GADCON_ORIENT_CORNER_RB:
328         x -= pw;
329         inst->hide_x = 1;
330         break;
331
332       case E_GADCON_ORIENT_FLOAT:
333       case E_GADCON_ORIENT_HORIZ:
334       case E_GADCON_ORIENT_VERT:
335       default:
336         break;
337      }
338
339    if (px + pw > inst->win->zone->w)
340      x = inst->win->zone->w - pw;
341
342    if (py + ph > inst->win->zone->h)
343      y = inst->win->zone->h - ph;
344
345    evas_object_move(ewin, x, y);
346 }
347
348 static void
349 _gadget_window_show(Instance *inst)
350 {
351    int zx, zy, zw, zh;
352    int gx, gy, gw, gh;
353    int cx, cy;
354    int pw, ph;
355
356    Evas_Object *ewin = inst->win->ewin;
357
358    inst->win->func.hide = &_evry_hide_func;
359
360    e_zone_useful_geometry_get(inst->win->zone, &zx, &zy, &zw, &zh);
361
362    evas_object_geometry_get(inst->o_button, &gx, &gy, &gw, &gh);
363    e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, NULL, NULL);
364    gx += cx;
365    gy += cy;
366
367    switch (inst->gcc->gadcon->orient)
368      {
369       case E_GADCON_ORIENT_TOP:
370       case E_GADCON_ORIENT_CORNER_TL:
371       case E_GADCON_ORIENT_CORNER_TR:
372         pw = zw / 2;
373         ph = zh / 2;
374         inst->hide_y = -1;
375         evas_object_move(ewin, zx, gy + gh);
376         break;
377
378       case E_GADCON_ORIENT_BOTTOM:
379       case E_GADCON_ORIENT_CORNER_BR:
380       case E_GADCON_ORIENT_CORNER_BL:
381         pw = zw / 2;
382         ph = zh / 2;
383         inst->hide_y = 1;
384         evas_object_move(ewin, zx, gy - ph);
385         break;
386
387       case E_GADCON_ORIENT_LEFT:
388       case E_GADCON_ORIENT_CORNER_LT:
389       case E_GADCON_ORIENT_CORNER_LB:
390         pw = zw / 2.5;
391         ph = zh;
392         inst->hide_x = -1;
393         evas_object_move(ewin, gx + gw, zy);
394         break;
395
396       case E_GADCON_ORIENT_RIGHT:
397       case E_GADCON_ORIENT_CORNER_RT:
398       case E_GADCON_ORIENT_CORNER_RB:
399         pw = zw / 2.5;
400         ph = zh;
401         inst->hide_x = 1;
402         evas_object_move(ewin, gx - pw, zy);
403         break;
404
405       case E_GADCON_ORIENT_FLOAT:
406       case E_GADCON_ORIENT_HORIZ:
407       case E_GADCON_ORIENT_VERT:
408       default:
409         pw = ph = 1;
410         break;
411      }
412
413    evas_object_resize(ewin, pw, ph);
414    evas_object_show(ewin);
415
416    {
417       E_Client *ec = e_win_client_get(ewin);
418
419       evas_object_focus_set(ec->frame, 1);
420       ec->netwm.state.skip_pager = 1;
421       ec->netwm.state.skip_taskbar = 1;
422       ec->sticky = 1;
423    }
424
425    inst->hidden = EINA_FALSE;
426 }
427
428 static void
429 _button_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
430 {
431    Instance *inst;
432    Evas_Event_Mouse_Down *ev;
433
434    inst = data;
435    /* if (!inst->mouse_down)
436     *   return; */
437
438    inst->mouse_down = 0;
439
440    ev = event_info;
441    if (ev->button == 1)
442      {
443         Evry_Window *win;
444         E_Client *ec;
445
446         if (inst->win)
447           {
448              win = inst->win;
449              ec = e_win_client_get(win->ewin);
450
451              if (inst->hidden || !ec->focused)
452                {
453                   if (inst->animating)
454                     e_comp_object_effect_stop(ec->frame, NULL);
455                   e_comp_object_effect_set(ec->frame, "none");
456                   e_client_uniconify(ec);
457                   evas_object_raise(ec->frame);
458                   evas_object_focus_set(ec->frame, 1);
459                   inst->hidden = EINA_FALSE;
460                   return;
461                }
462              else
463                {
464                   evry_hide(win, 1);
465                   return;
466                }
467           }
468
469         win = evry_show(e_util_zone_current_get(e_manager_current_get()),
470                         0, inst->cfg->plugin, !inst->illume_mode);
471         if (!win) return;
472
473         inst->win = win;
474         win->data = inst;
475
476         ecore_evas_name_class_set(e_win_ee_get(win->ewin), "E", "everything-window");
477
478         if (inst->illume_mode)
479           _gadget_window_show(inst);
480         else
481           _gadget_popup_show(inst);
482
483         e_gadcon_locked_set(inst->gcc->gadcon, 1);
484
485         evas_object_event_callback_add(win->ewin, EVAS_CALLBACK_DEL, _del_func, inst);
486
487         edje_object_signal_emit(inst->o_button, "e,state,focused", "e");
488      }
489    else if (ev->button == 3)
490      {
491         E_Menu *m;
492         E_Menu_Item *mi;
493         int cx, cy;
494
495         m = e_menu_new();
496         mi = e_menu_item_new(m);
497         e_menu_item_label_set(mi, _("Settings"));
498         e_util_menu_item_theme_icon_set(mi, "configure");
499         e_menu_item_callback_set(mi, _cb_menu_configure, inst);
500
501         m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
502
503         e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy,
504                                           NULL, NULL);
505         e_menu_activate_mouse(m,
506                               e_util_zone_current_get(e_manager_current_get()),
507                               cx + ev->output.x, cy + ev->output.y, 1, 1,
508                               E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
509         evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button,
510                                  EVAS_BUTTON_NONE, ev->timestamp, NULL);
511      }
512 }
513
514 /* static void
515  * _button_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
516  * {
517  *    Instance *inst;
518  *    Evas_Event_Mouse_Down *ev;
519  *
520  *    inst = data;
521  *    inst->mouse_down = 1;
522  * } */
523
524 int
525 evry_gadget_init(void)
526 {
527    e_gadcon_provider_register(&_gadcon_class);
528    return 1;
529 }
530
531 void
532 evry_gadget_shutdown(void)
533 {
534    e_gadcon_provider_unregister(&_gadcon_class);
535 }
536
537 /***************************************************************************/
538
539 struct _E_Config_Dialog_Data
540 {
541    const char  *plugin;
542    int          hide_after_action;
543    int          popup;
544    Evas_Object *list;
545 };
546
547 static void        *_create_data(E_Config_Dialog *cfd);
548 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
549 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
550 static int          _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
551
552 static void
553 _conf_dialog(Instance *inst)
554 {
555    E_Config_Dialog_View *v = NULL;
556
557    if (inst->cfd)
558      return;
559
560    /* if (e_config_dialog_find("everything-gadgets", "launcher/everything-gadgets"))
561     *   return; */
562
563    v = E_NEW(E_Config_Dialog_View, 1);
564    if (!v) return;
565
566    v->create_cfdata = _create_data;
567    v->free_cfdata = _free_data;
568    v->basic.create_widgets = _basic_create;
569    v->basic.apply_cfdata = _basic_apply;
570
571    inst->cfd = e_config_dialog_new(NULL, _("Everything Gadgets"), "everything-gadgets",
572                                    "launcher/everything-gadgets", NULL, 0, v, inst);
573
574    /* _conf->cfd = cfd; */
575 }
576
577 static void *
578 _create_data(E_Config_Dialog *cfd)
579 {
580    E_Config_Dialog_Data *cfdata = NULL;
581    Instance *inst = cfd->data;
582    Gadget_Config *gc = inst->cfg;
583
584    cfdata = E_NEW(E_Config_Dialog_Data, 1);
585
586 #define CP(_name) cfdata->_name = (gc->_name ? strdup(gc->_name) : NULL);
587 #define C(_name)  cfdata->_name = gc->_name;
588    /* CP(plugin); */
589    C(hide_after_action);
590    C(popup);
591 #undef CP
592 #undef C
593
594    return cfdata;
595 }
596
597 static void
598 _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
599 {
600    Instance *inst = cfd->data;
601
602    inst->cfd = NULL;
603    /* if (cfdata->plugin) free(cfdata->plugin); */
604    E_FREE(cfdata);
605 }
606
607 static void
608 _cb_button_settings(void *data __UNUSED__, void *data2 __UNUSED__)
609 {
610    /* evry_collection_conf_dialog(NULL, "Start"); */
611 }
612
613 static void
614 _fill_list(Eina_List *plugins, Evas_Object *obj, E_Config_Dialog_Data *cfdata)
615 {
616    Evas *evas;
617    Evas_Coord w;
618    Eina_List *l;
619    Plugin_Config *pc;
620    int sel = 0, cnt = 1;
621
622    evas = evas_object_evas_get(obj);
623    evas_event_freeze(evas);
624    edje_freeze();
625    e_widget_ilist_freeze(obj);
626    e_widget_ilist_clear(obj);
627
628    e_widget_ilist_append(obj, NULL, _("All"), NULL, NULL, NULL);
629
630    EINA_LIST_FOREACH (plugins, l, pc)
631      {
632         if (!pc->plugin) continue;
633         e_widget_ilist_append(obj, NULL, pc->plugin->base.label, NULL, NULL, pc->name);
634         if (cfdata->plugin && !strcmp(pc->name, cfdata->plugin))
635           sel = cnt;
636
637         cnt++;
638      }
639
640    e_widget_ilist_selected_set(obj, sel);
641
642    e_widget_ilist_go(obj);
643    e_widget_size_min_get(obj, &w, NULL);
644    e_widget_size_min_set(obj, w > 180 ? w : 180, 140);
645    e_widget_ilist_thaw(obj);
646    edje_thaw();
647    evas_event_thaw(evas);
648 }
649
650 #if 0
651 static void
652 _list_select_cb(void *data __UNUSED__, Evas_Object *obj)
653 {
654    int sel = e_widget_ilist_selected_get(obj);
655
656    e_widget_ilist_nth_data_get(obj, sel);
657 }
658
659 #endif
660
661 static Evas_Object *
662 _basic_create(E_Config_Dialog *cfd, Evas *e, E_Config_Dialog_Data *cfdata)
663 {
664    Evas_Object *o = NULL, *of = NULL, *ow = NULL;
665    Instance *inst = cfd->data;
666
667    o = e_widget_list_add(e, 0, 0);
668
669    of = e_widget_framelist_add(e, _("Plugin"), 0);
670    /* ow = e_widget_entry_add(e, &(cfdata->plugin), NULL, NULL, NULL);
671     * e_widget_framelist_object_append(of, ow); */
672
673    ow = e_widget_ilist_add(e, 24, 24, &cfdata->plugin);
674    /* e_widget_on_change_hook_set(ow, _list_select_cb, cfdata); */
675    _fill_list(evry_conf->conf_subjects, ow, cfdata);
676    e_widget_framelist_object_append(of, ow);
677    cfdata->list = ow;
678
679    ow = e_widget_button_add(e, _("Settings"), NULL, _cb_button_settings, inst, NULL);
680    e_widget_framelist_object_append(of, ow);
681
682    e_widget_list_object_append(o, of, 1, 1, 0.5);
683
684    return o;
685 }
686
687 static int
688 _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
689 {
690    Instance *inst = cfd->data;
691    Gadget_Config *gc = inst->cfg;
692    Evry_Plugin *p;
693    Evas_Object *oo;
694    const char *plugin;
695
696 #define CP(_name)                     \
697   if (gc->_name)                      \
698     eina_stringshare_del(gc->_name);  \
699   gc->_name = eina_stringshare_add(cfdata->_name);
700 #define C(_name) gc->_name = cfdata->_name;
701    eina_stringshare_del(gc->plugin); \
702    plugin = e_widget_ilist_selected_label_get(cfdata->list);
703    if (plugin && plugin[0])
704      gc->plugin = eina_stringshare_add(cfdata->plugin);
705    else
706      gc->plugin = NULL;
707    C(hide_after_action);
708    C(popup);
709 #undef CP
710 #undef C
711
712    e_config_save_queue();
713
714    oo = edje_object_part_swallow_get(inst->o_button, "e.swallow.icon");
715    if (oo) evas_object_del(oo);
716
717    edje_object_signal_emit(inst->o_button, "e,state,icon,default", "e");
718
719    if ((p = evry_plugin_find(inst->cfg->plugin)))
720      {
721         oo = evry_util_icon_get(EVRY_ITEM(p), evas_object_evas_get(inst->o_button));
722         if (oo)
723           {
724              edje_object_part_swallow(inst->o_button, "e.swallow.icon", oo);
725              edje_object_signal_emit(inst->o_button, "e,state,icon,plugin", "e");
726           }
727      }
728
729    return 1;
730 }
731