update for beta release
[framework/uifw/e17.git] / src / modules / conf_keybindings / e_int_config_acpibindings.c
1 #include "e.h"
2
3 /**
4  * TODO:
5  * Maybe use a toolbook widget instead of 2 lists ??
6  * Maybe add a way to restore default acpi bindings ??
7  */
8
9 /* local config structure */
10 struct _E_Config_Dialog_Data
11 {
12    Eina_List *bindings;
13    Evas_Object *o_bindings, *o_actions, *o_params;
14    Evas_Object *o_add, *o_del;
15    const char *bindex;
16
17    E_Config_Dialog *cfd;
18 };
19
20 /* local function prototypes */
21 static void        *_create_data(E_Config_Dialog *cfd);
22 static void         _fill_data(E_Config_Dialog_Data *cfdata);
23 static void         _free_data(E_Config_Dialog *cfd  __UNUSED__,
24                                E_Config_Dialog_Data *cfdata);
25 static int          _basic_apply(E_Config_Dialog *cfd  __UNUSED__,
26                                  E_Config_Dialog_Data *cfdata);
27 static Evas_Object *_basic_create(E_Config_Dialog      *cfd,
28                                   Evas                 *evas,
29                                   E_Config_Dialog_Data *cfdata);
30 static void                   _fill_bindings(E_Config_Dialog_Data *cfdata);
31 static void                   _fill_actions(E_Config_Dialog_Data *cfdata);
32 static E_Config_Binding_Acpi *_selected_binding_get(E_Config_Dialog_Data *cfdata);
33 static E_Action_Description  *_selected_action_get(E_Config_Dialog_Data *cfdata);
34 static const char            *_binding_label_get(E_Config_Binding_Acpi *bind);
35 static void                   _cb_bindings_changed(void *data);
36 static void                   _cb_actions_changed(void *data);
37 static void                   _cb_entry_changed(void       *data,
38                                                 void *data2 __UNUSED__);
39 static void                   _cb_add_binding(void       *data,
40                                               void *data2 __UNUSED__);
41 static void                   _cb_del_binding(void       *data,
42                                               void *data2 __UNUSED__);
43 static Eina_Bool              _cb_grab_key_down(void    *data,
44                                                 int type __UNUSED__,
45                                                 void    *event);
46 static Eina_Bool _cb_acpi_event(void *data,
47                                 int   type,
48                                 void *event);
49
50 /* local variables */
51 static E_Dialog *grab_dlg = NULL;
52 static Ecore_X_Window grab_win = 0;
53 static Eina_List *grab_hdls = NULL;
54
55 E_Config_Dialog *
56 e_int_config_acpibindings(E_Container       *con,
57                           const char *params __UNUSED__)
58 {
59    E_Config_Dialog *cfd;
60    E_Config_Dialog_View *v;
61
62    if ((e_config_dialog_find("E", "advanced/acpi_bindings")))
63      return NULL;
64
65    v = E_NEW(E_Config_Dialog_View, 1);
66    v->create_cfdata = _create_data;
67    v->free_cfdata = _free_data;
68    v->basic.apply_cfdata = _basic_apply;
69    v->basic.create_widgets = _basic_create;
70
71    cfd = e_config_dialog_new(con, _("ACPI Bindings"), "E",
72                              "advanced/acpi_bindings",
73                              "preferences-system-power-management",
74                              0, v, NULL);
75
76    return cfd;
77 }
78
79 /* local functions */
80 static void *
81 _create_data(E_Config_Dialog *cfd)
82 {
83    E_Config_Dialog_Data *cfdata;
84
85    cfdata = E_NEW(E_Config_Dialog_Data, 1);
86    _fill_data(cfdata);
87    cfdata->cfd = cfd;
88    return cfdata;
89 }
90
91 static void
92 _fill_data(E_Config_Dialog_Data *cfdata)
93 {
94    Eina_List *l;
95    E_Config_Binding_Acpi *bind;
96
97    EINA_LIST_FOREACH(e_config->acpi_bindings, l, bind)
98      {
99         E_Config_Binding_Acpi *b2;
100
101         b2 = E_NEW(E_Config_Binding_Acpi, 1);
102         b2->context = bind->context;
103         b2->type = bind->type;
104         b2->status = bind->status;
105         b2->action = eina_stringshare_ref(bind->action);
106         b2->params = eina_stringshare_ref(bind->params);
107         cfdata->bindings = eina_list_append(cfdata->bindings, b2);
108      }
109 }
110
111 static void
112 _free_data(E_Config_Dialog *cfd  __UNUSED__,
113            E_Config_Dialog_Data *cfdata)
114 {
115    E_Config_Binding_Acpi *bind;
116    Ecore_Event_Handler *hdl;
117
118    EINA_LIST_FREE(cfdata->bindings, bind)
119      {
120         if (bind->action) eina_stringshare_del(bind->action);
121         if (bind->params) eina_stringshare_del(bind->params);
122         E_FREE(bind);
123      }
124
125    /* free the handlers */
126    EINA_LIST_FREE(grab_hdls, hdl)
127      ecore_event_handler_del(hdl);
128
129    if (grab_win)
130      {
131         e_grabinput_release(grab_win, grab_win);
132         ecore_x_window_free(grab_win);
133      }
134    grab_win = 0;
135
136    if (grab_dlg)
137      {
138         e_object_del(E_OBJECT(grab_dlg));
139         e_acpi_events_thaw();
140      }
141    grab_dlg = NULL;
142
143    E_FREE(cfdata);
144 }
145
146 static int
147 _basic_apply(E_Config_Dialog *cfd  __UNUSED__,
148              E_Config_Dialog_Data *cfdata)
149 {
150    E_Config_Binding_Acpi *bind, *b2;
151    Eina_List *l;
152
153    EINA_LIST_FREE(e_config->acpi_bindings, bind)
154      {
155         e_bindings_acpi_del(bind->context, bind->type, bind->status,
156                             bind->action, bind->params);
157         if (bind->action) eina_stringshare_del(bind->action);
158         if (bind->params) eina_stringshare_del(bind->params);
159         E_FREE(bind);
160      }
161
162    EINA_LIST_FOREACH(cfdata->bindings, l, bind)
163      {
164         b2 = E_NEW(E_Config_Binding_Acpi, 1);
165         b2->context = bind->context;
166         b2->type = bind->type;
167         b2->status = bind->status;
168         b2->action = eina_stringshare_ref(bind->action);
169         b2->params = eina_stringshare_ref(bind->params);
170         e_config->acpi_bindings =
171           eina_list_append(e_config->acpi_bindings, b2);
172
173         e_bindings_acpi_add(b2->context, b2->type, b2->status,
174                             b2->action, b2->params);
175      }
176    e_config_save_queue();
177
178    return 1;
179 }
180
181 static Evas_Object *
182 _basic_create(E_Config_Dialog      *cfd,
183               Evas                 *evas,
184               E_Config_Dialog_Data *cfdata)
185 {
186    Evas_Object *ol, *of, *ow, *ot;
187
188    ol = e_widget_list_add(evas, 0, 1);
189
190    of = e_widget_frametable_add(evas, _("ACPI Bindings"), 0);
191    ow = e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale),
192                            &(cfdata->bindex));
193    cfdata->o_bindings = ow;
194    _fill_bindings(cfdata);
195    e_widget_frametable_object_append(of, ow, 0, 0, 2, 1, 1, 1, 1, 1);
196
197    ow = e_widget_button_add(evas, _("Add Binding"), "list-add",
198                             _cb_add_binding, cfdata, NULL);
199    cfdata->o_add = ow;
200    e_widget_frametable_object_append(of, ow, 0, 1, 1, 1, 1, 0, 1, 0);
201    ow = e_widget_button_add(evas, _("Delete Binding"), "list-remove",
202                             _cb_del_binding, cfdata, NULL);
203    cfdata->o_del = ow;
204    e_widget_disabled_set(ow, EINA_TRUE);
205    e_widget_frametable_object_append(of, ow, 1, 1, 1, 1, 1, 0, 1, 0);
206    e_widget_list_object_append(ol, of, 1, 1, 0.5);
207
208    ot = e_widget_table_add(evas, 0);
209    of = e_widget_framelist_add(evas, _("Action"), 0);
210    ow = e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale), NULL);
211    cfdata->o_actions = ow;
212    _fill_actions(cfdata);
213    e_widget_framelist_object_append(of, ow);
214    e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1);
215
216    ow = e_widget_framelist_add(evas, _("Action Params"), 0);
217    cfdata->o_params =
218      e_widget_entry_add(evas, NULL, _cb_entry_changed, cfdata, NULL);
219    e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
220    e_widget_framelist_object_append(ow, cfdata->o_params);
221    e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 1, 0, 1, 0);
222    e_widget_list_object_append(ol, ot, 1, 1, 0.5);
223
224    e_dialog_resizable_set(cfd->dia, 1);
225    return ol;
226 }
227
228 static void
229 _fill_bindings(E_Config_Dialog_Data *cfdata)
230 {
231    Evas *evas;
232    Eina_List *l;
233    E_Config_Binding_Acpi *bind;
234    int i = -1, mw;
235
236    evas = evas_object_evas_get(cfdata->o_bindings);
237    evas_event_freeze(evas);
238    edje_freeze();
239    e_widget_ilist_freeze(cfdata->o_bindings);
240    e_widget_ilist_clear(cfdata->o_bindings);
241
242    EINA_LIST_FOREACH(cfdata->bindings, l, bind)
243      {
244         const char *lbl;
245         char buff[32];
246
247         i++;
248         snprintf(buff, sizeof(buff), "%d", i);
249
250         lbl = _binding_label_get(bind);
251
252         e_widget_ilist_append(cfdata->o_bindings, NULL, lbl,
253                                 _cb_bindings_changed, cfdata, buff);
254      }
255
256    e_widget_ilist_go(cfdata->o_bindings);
257    e_widget_size_min_get(cfdata->o_bindings, &mw, NULL);
258    if (mw < (160 * e_scale)) mw = (160 * e_scale);
259    e_widget_size_min_set(cfdata->o_bindings, mw, 200);
260    e_widget_ilist_thaw(cfdata->o_bindings);
261    edje_thaw();
262    evas_event_thaw(evas);
263 }
264
265 static void
266 _fill_actions(E_Config_Dialog_Data *cfdata)
267 {
268    Evas *evas;
269    Eina_List *l, *ll;
270    E_Action_Group *grp;
271    E_Action_Description *dsc;
272    int mw;
273
274    evas = evas_object_evas_get(cfdata->o_actions);
275    evas_event_freeze(evas);
276    edje_freeze();
277    e_widget_ilist_freeze(cfdata->o_actions);
278    e_widget_ilist_clear(cfdata->o_actions);
279
280    EINA_LIST_FOREACH(e_action_groups_get(), l, grp)
281      {
282         if (!grp->acts) continue;
283 //        if ((strcmp(grp->act_grp, "Acpi")) &&
284 //            (strcmp(grp->act_grp, "System")) &&
285 //            (strcmp(grp->act_grp, "Launch"))) continue;
286         e_widget_ilist_header_append(cfdata->o_actions, NULL, _(grp->act_grp));
287         EINA_LIST_FOREACH(grp->acts, ll, dsc)
288           e_widget_ilist_append(cfdata->o_actions, NULL, _(dsc->act_name),
289                                 _cb_actions_changed, cfdata, dsc->act_cmd);
290      }
291
292    e_widget_ilist_go(cfdata->o_actions);
293    e_widget_size_min_get(cfdata->o_actions, &mw, NULL);
294    if (mw < (160 * e_scale)) mw = (160 * e_scale);
295    e_widget_size_min_set(cfdata->o_actions, mw, 200);
296    e_widget_ilist_thaw(cfdata->o_actions);
297    edje_thaw();
298    evas_event_thaw(evas);
299 }
300
301 static E_Config_Binding_Acpi *
302 _selected_binding_get(E_Config_Dialog_Data *cfdata)
303 {
304    E_Config_Binding_Acpi *bind;
305
306    if ((!cfdata) || (!cfdata->bindex)) return NULL;
307    if (!(bind = eina_list_nth(cfdata->bindings, atoi(cfdata->bindex))))
308      return NULL;
309    return bind;
310 }
311
312 static E_Action_Description *
313 _selected_action_get(E_Config_Dialog_Data *cfdata)
314 {
315    E_Action_Group *grp;
316    E_Action_Description *dsc = NULL;
317    Eina_List *l, *ll;
318    const char *lbl;
319    int sel;
320
321    if (!cfdata) return NULL;
322    sel = e_widget_ilist_selected_get(cfdata->o_actions);
323    if (sel < 0) return NULL;
324    if (!(lbl = e_widget_ilist_nth_label_get(cfdata->o_actions, sel)))
325      return NULL;
326
327    EINA_LIST_FOREACH(e_action_groups_get(), l, grp)
328      {
329         if (!grp->acts) continue;
330 //        if ((strcmp(grp->act_grp, "Acpi")) &&
331 //            (strcmp(grp->act_grp, "System")) &&
332 //            (strcmp(grp->act_grp, "Launch"))) continue;
333         EINA_LIST_FOREACH(grp->acts, ll, dsc)
334           {
335              if ((dsc->act_name) && (!strcmp(dsc->act_name, lbl))) 
336                return dsc;
337           }
338      }
339
340    return NULL;
341 }
342
343 static const char *
344 _binding_label_get(E_Config_Binding_Acpi *bind)
345 {
346    if (bind->type == E_ACPI_TYPE_UNKNOWN) return NULL;
347    if (bind->type == E_ACPI_TYPE_AC_ADAPTER)
348      {
349         if (bind->status == 0) return _("AC Adapter Unplugged");
350         if (bind->status == 1) return _("AC Adapter Plugged");
351         return _("Ac Adapter");
352      }
353    if (bind->type == E_ACPI_TYPE_BATTERY)
354      return _("Battery");
355    if (bind->type == E_ACPI_TYPE_BUTTON)
356      return _("Button");
357    if (bind->type == E_ACPI_TYPE_FAN)
358      return _("Fan");
359    if (bind->type == E_ACPI_TYPE_LID)
360      {
361         if (bind->status == 0) return _("Lid Closed");
362         if (bind->status == 1) return _("Lid Opened");
363         return _("Lid");
364      }
365    if (bind->type == E_ACPI_TYPE_POWER)
366      return _("Power Button");
367    if (bind->type == E_ACPI_TYPE_PROCESSOR)
368      return _("Processor");
369    if (bind->type == E_ACPI_TYPE_SLEEP)
370      return _("Sleep Button");
371    if (bind->type == E_ACPI_TYPE_THERMAL)
372      return _("Thermal");
373    if (bind->type == E_ACPI_TYPE_VIDEO)
374      return _("Video");
375    if (bind->type == E_ACPI_TYPE_WIFI)
376      return _("Wifi");
377    if (bind->type == E_ACPI_TYPE_HIBERNATE)
378      return _("Hibernate");
379    if (bind->type == E_ACPI_TYPE_ZOOM_OUT)
380      return _("Zoom Out");
381    if (bind->type == E_ACPI_TYPE_ZOOM_IN)
382      return _("Zoom In");
383    if (bind->type == E_ACPI_TYPE_BRIGHTNESS_DOWN)
384      return _("Brightness Down");
385    if (bind->type == E_ACPI_TYPE_BRIGHTNESS_UP)
386      return _("Brightness Up");
387    if (bind->type == E_ACPI_TYPE_ASSIST)
388      return _("Assist");
389    if (bind->type == E_ACPI_TYPE_S1)
390      return _("S1");
391    if (bind->type == E_ACPI_TYPE_VAIO)
392      return _("Vaio");
393
394    return _("Unknown");
395 }
396
397 static void
398 _cb_bindings_changed(void *data)
399 {
400    E_Config_Dialog_Data *cfdata;
401    E_Config_Binding_Acpi *bind;
402    Eina_List *items;
403    const E_Ilist_Item *item;
404    int i = -1;
405
406    if (!(cfdata = data)) return;
407    e_widget_entry_clear(cfdata->o_params);
408    if (!(bind = _selected_binding_get(cfdata)))
409      {
410         e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
411         e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
412         return;
413      }
414
415    e_widget_disabled_set(cfdata->o_del, EINA_FALSE);
416    e_widget_ilist_unselect(cfdata->o_actions);
417
418    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->o_actions), items, item)
419      {
420         const char *val;
421
422         i++;
423         if (!(val = e_widget_ilist_item_value_get(item))) continue;
424         if (strcmp(val, bind->action)) continue;
425         e_widget_ilist_selected_set(cfdata->o_actions, i);
426         break;
427      }
428 }
429
430 static void
431 _cb_actions_changed(void *data)
432 {
433    E_Config_Dialog_Data *cfdata;
434    E_Config_Binding_Acpi *bind;
435    E_Action_Description *dsc;
436
437    if (!(cfdata = data)) return;
438    e_widget_entry_clear(cfdata->o_params);
439    if (!(bind = _selected_binding_get(cfdata)))
440      {
441         e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
442         e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
443         return;
444      }
445    if (!(dsc = _selected_action_get(cfdata)))
446      {
447         e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
448         return;
449      }
450
451    eina_stringshare_replace(&bind->action, dsc->act_cmd);
452    e_widget_disabled_set(cfdata->o_params, !(dsc->editable));
453
454    if ((!dsc->editable) && (dsc->act_params))
455      e_widget_entry_text_set(cfdata->o_params, dsc->act_params);
456    else if (bind->params)
457      e_widget_entry_text_set(cfdata->o_params, bind->params);
458    else
459      {
460         if ((!dsc->param_example) || (!dsc->param_example[0]))
461           e_widget_entry_text_set(cfdata->o_params, _("<None>"));
462         else
463           e_widget_entry_text_set(cfdata->o_params, dsc->param_example);
464      }
465 }
466
467 static void
468 _cb_entry_changed(void       *data,
469                   void *data2 __UNUSED__)
470 {
471    E_Config_Dialog_Data *cfdata;
472    E_Config_Binding_Acpi *bind;
473    E_Action_Description *dsc;
474
475    if (!(cfdata = data)) return;
476    if (!(dsc = _selected_action_get(cfdata))) return;
477    if (!dsc->editable) return;
478    if (!(bind = _selected_binding_get(cfdata))) return;
479    eina_stringshare_replace(&bind->params,
480                             e_widget_entry_text_get(cfdata->o_params));
481 }
482
483 static void
484 _cb_add_binding(void       *data,
485                 void *data2 __UNUSED__)
486 {
487    E_Config_Dialog_Data *cfdata;
488    E_Manager *man;
489
490    if (grab_win != 0) return;
491    if (!(cfdata = data)) return;
492    man = e_manager_current_get();
493    grab_dlg = e_dialog_new(e_container_current_get(man), "E",
494                            "_acpibind_getbind_dialog");
495    if (!grab_dlg) return;
496    e_dialog_title_set(grab_dlg, _("ACPI Binding"));
497    e_dialog_icon_set(grab_dlg, "preferences-system-power-management", 48);
498    e_dialog_text_set(grab_dlg,
499                      _("Please trigger the ACPI event you wish to bind to, "
500                        "<br><br>or <hilight>Escape</hilight> to abort."));
501    e_win_centered_set(grab_dlg->win, EINA_TRUE);
502    e_win_borderless_set(grab_dlg->win, EINA_TRUE);
503
504    grab_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1);
505    ecore_x_window_show(grab_win);
506    e_grabinput_get(grab_win, 0, grab_win);
507
508    grab_hdls =
509      eina_list_append(grab_hdls,
510                       ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
511                                               _cb_grab_key_down, cfdata));
512    grab_hdls =
513      eina_list_append(grab_hdls,
514                       ecore_event_handler_add(E_EVENT_ACPI,
515                                               _cb_acpi_event, cfdata));
516
517    /* freeze all incoming acpi events */
518    e_acpi_events_freeze();
519
520    e_dialog_show(grab_dlg);
521    ecore_x_icccm_transient_for_set(grab_dlg->win->evas_win,
522                                    cfdata->cfd->dia->win->evas_win);
523 }
524
525 static void
526 _cb_del_binding(void       *data,
527                 void *data2 __UNUSED__)
528 {
529    E_Config_Dialog_Data *cfdata;
530    E_Config_Binding_Acpi *bind, *bind2;
531    Eina_List *l;
532
533    if (!(cfdata = data)) return;
534    if (!(bind = _selected_binding_get(cfdata))) return;
535
536    /* delete from e_config */
537    EINA_LIST_FOREACH(e_config->acpi_bindings, l, bind2)
538      {
539         if ((bind->context == bind2->context) && (bind->type == bind2->type) &&
540             (((bind->action) && (bind2->action) &&
541               (!strcmp(bind->action, bind2->action))) ||
542              ((!bind->action) && (!bind2->action))) &&
543             (((bind->params) && (bind2->params) &&
544               (!strcmp(bind->params, bind2->params))) ||
545              ((!bind->params) && (!bind2->params))))
546           {
547              if (bind2->action) eina_stringshare_del(bind2->action);
548              if (bind2->params) eina_stringshare_del(bind2->params);
549              E_FREE(bind2);
550              e_config->acpi_bindings =
551                eina_list_remove_list(e_config->acpi_bindings, l);
552              e_config_save_queue();
553              break;
554           }
555      }
556
557    /* delete from e_bindings */
558    e_bindings_acpi_del(bind->context, bind->type, bind->status,
559                        bind->action, bind->params);
560
561    /* delete from dialog list */
562    EINA_LIST_FOREACH(cfdata->bindings, l, bind2)
563      {
564         if ((bind->context == bind2->context) && (bind->type == bind2->type) &&
565             (((bind->action) && (bind2->action) &&
566               (!strcmp(bind->action, bind2->action))) ||
567              ((!bind->action) && (!bind2->action))) &&
568             (((bind->params) && (bind2->params) &&
569               (!strcmp(bind->params, bind2->params))) ||
570              ((!bind->params) && (!bind2->params))))
571           {
572              if (bind2->action) eina_stringshare_del(bind2->action);
573              if (bind2->params) eina_stringshare_del(bind2->params);
574              E_FREE(bind2);
575              cfdata->bindings = eina_list_remove_list(cfdata->bindings, l);
576              break;
577           }
578      }
579
580    /* reset gui */
581    e_widget_entry_clear(cfdata->o_params);
582    e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
583    e_widget_ilist_unselect(cfdata->o_actions);
584    e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
585    _fill_bindings(cfdata);
586 }
587
588 static Eina_Bool
589 _cb_grab_key_down(void    *data,
590                   int type __UNUSED__,
591                   void    *event)
592 {
593    E_Config_Dialog_Data *cfdata;
594    Ecore_Event_Key *ev;
595
596    ev = event;
597    if (ev->window != grab_win) return ECORE_CALLBACK_PASS_ON;
598    if (!(cfdata = data)) return ECORE_CALLBACK_PASS_ON;
599    if (!strcmp(ev->keyname, "Escape"))
600      {
601         Ecore_Event_Handler *hdl;
602
603         /* free the handlers */
604         EINA_LIST_FREE(grab_hdls, hdl)
605           ecore_event_handler_del(hdl);
606
607         /* kill the dialog window */
608         e_grabinput_release(grab_win, grab_win);
609         ecore_x_window_free(grab_win);
610         grab_win = 0;
611         e_object_del(E_OBJECT(grab_dlg));
612         grab_dlg = NULL;
613
614         /* unfreeze acpi events */
615         e_acpi_events_thaw();
616      }
617    return ECORE_CALLBACK_PASS_ON;
618 }
619
620 static Eina_Bool
621 _cb_acpi_event(void          *data,
622                __UNUSED__ int type,
623                void          *event)
624 {
625    E_Event_Acpi *ev;
626    E_Config_Dialog_Data *cfdata;
627    E_Config_Binding_Acpi *bind;
628    Ecore_Event_Handler *hdl;
629
630    ev = event;
631    if (!(cfdata = data)) return ECORE_CALLBACK_PASS_ON;
632
633    /* free the handlers */
634    EINA_LIST_FREE(grab_hdls, hdl)
635      ecore_event_handler_del(hdl);
636
637    /* kill the dialog window */
638    e_grabinput_release(grab_win, grab_win);
639    ecore_x_window_free(grab_win);
640    grab_win = 0;
641    e_object_del(E_OBJECT(grab_dlg));
642    grab_dlg = NULL;
643
644    /* unfreeze acpi events */
645    e_acpi_events_thaw();
646
647    /* NB: This may need more testing/parsing for event status */
648    bind = E_NEW(E_Config_Binding_Acpi, 1);
649    bind->context = E_BINDING_CONTEXT_NONE;
650    bind->type = ev->type;
651    bind->status = ev->status;
652    bind->action = eina_stringshare_add("dim_screen");
653    bind->params = NULL;
654
655    cfdata->bindings = eina_list_append(cfdata->bindings, bind);
656    _fill_bindings(cfdata);
657    return ECORE_CALLBACK_DONE;
658 }
659