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