Merge from TIZEN 2.3
[platform/core/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 *binding;
96
97    EINA_LIST_FOREACH(e_config->acpi_bindings, l, binding)
98      {
99         E_Config_Binding_Acpi *b2;
100
101         b2 = E_NEW(E_Config_Binding_Acpi, 1);
102         b2->context = binding->context;
103         b2->type = binding->type;
104         b2->status = binding->status;
105         b2->action = eina_stringshare_ref(binding->action);
106         b2->params = eina_stringshare_ref(binding->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 *binding;
116    Ecore_Event_Handler *hdl;
117
118    EINA_LIST_FREE(cfdata->bindings, binding)
119      {
120         if (binding->action) eina_stringshare_del(binding->action);
121         if (binding->params) eina_stringshare_del(binding->params);
122         E_FREE(binding);
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 *binding, *b2;
151    Eina_List *l;
152
153    EINA_LIST_FREE(e_config->acpi_bindings, binding)
154      {
155         e_bindings_acpi_del(binding->context, binding->type, binding->status,
156                             binding->action, binding->params);
157         if (binding->action) eina_stringshare_del(binding->action);
158         if (binding->params) eina_stringshare_del(binding->params);
159         E_FREE(binding);
160      }
161
162    EINA_LIST_FOREACH(cfdata->bindings, l, binding)
163      {
164         b2 = E_NEW(E_Config_Binding_Acpi, 1);
165         b2->context = binding->context;
166         b2->type = binding->type;
167         b2->status = binding->status;
168         b2->action = eina_stringshare_ref(binding->action);
169         b2->params = eina_stringshare_ref(binding->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"), "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"), "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 *binding;
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, binding)
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(binding);
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 *binding;
305
306    if ((!cfdata) || (!cfdata->bindex)) return NULL;
307    if (!(binding = eina_list_nth(cfdata->bindings, atoi(cfdata->bindex))))
308      return NULL;
309    return binding;
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 *binding)
345 {
346    if (binding->type == E_ACPI_TYPE_UNKNOWN) return NULL;
347    if (binding->type == E_ACPI_TYPE_AC_ADAPTER)
348      {
349         if (binding->status == 0) return _("AC Adapter Unplugged");
350         if (binding->status == 1) return _("AC Adapter Plugged");
351         return _("Ac Adapter");
352      }
353    if (binding->type == E_ACPI_TYPE_BATTERY)
354      return _("Battery");
355    if (binding->type == E_ACPI_TYPE_BUTTON)
356      return _("Button");
357    if (binding->type == E_ACPI_TYPE_FAN)
358      return _("Fan");
359    if (binding->type == E_ACPI_TYPE_LID)
360      {
361         if (binding->status == E_ACPI_LID_UNKNOWN) return _("Lid Unknown");
362         if (binding->status == E_ACPI_LID_CLOSED) return _("Lid Closed");
363         if (binding->status == E_ACPI_LID_OPEN) return _("Lid Opened");
364         return _("Lid");
365      }
366    if (binding->type == E_ACPI_TYPE_POWER)
367      return _("Power Button");
368    if (binding->type == E_ACPI_TYPE_PROCESSOR)
369      return _("Processor");
370    if (binding->type == E_ACPI_TYPE_SLEEP)
371      return _("Sleep Button");
372    if (binding->type == E_ACPI_TYPE_THERMAL)
373      return _("Thermal");
374    if (binding->type == E_ACPI_TYPE_VIDEO)
375      return _("Video");
376    if (binding->type == E_ACPI_TYPE_WIFI)
377      return _("Wifi");
378    if (binding->type == E_ACPI_TYPE_HIBERNATE)
379      return _("Hibernate");
380    if (binding->type == E_ACPI_TYPE_ZOOM_OUT)
381      return _("Zoom Out");
382    if (binding->type == E_ACPI_TYPE_ZOOM_IN)
383      return _("Zoom In");
384    if (binding->type == E_ACPI_TYPE_BRIGHTNESS_DOWN)
385      return _("Brightness Down");
386    if (binding->type == E_ACPI_TYPE_BRIGHTNESS_UP)
387      return _("Brightness Up");
388    if (binding->type == E_ACPI_TYPE_ASSIST)
389      return _("Assist");
390    if (binding->type == E_ACPI_TYPE_S1)
391      return _("S1");
392    if (binding->type == E_ACPI_TYPE_VAIO)
393      return _("Vaio");
394
395    return _("Unknown");
396 }
397
398 static void
399 _cb_bindings_changed(void *data)
400 {
401    E_Config_Dialog_Data *cfdata;
402    E_Config_Binding_Acpi *binding;
403    const Eina_List *items;
404    const E_Ilist_Item *item;
405    int i = -1;
406
407    if (!(cfdata = data)) return;
408    e_widget_entry_clear(cfdata->o_params);
409    if (!(binding = _selected_binding_get(cfdata)))
410      {
411         e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
412         e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
413         return;
414      }
415
416    e_widget_disabled_set(cfdata->o_del, EINA_FALSE);
417    e_widget_ilist_unselect(cfdata->o_actions);
418
419    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->o_actions), items, item)
420      {
421         const char *val;
422
423         i++;
424         if (!(val = e_widget_ilist_item_value_get(item))) continue;
425         if (strcmp(val, binding->action)) continue;
426         e_widget_ilist_selected_set(cfdata->o_actions, i);
427         break;
428      }
429 }
430
431 static void
432 _cb_actions_changed(void *data)
433 {
434    E_Config_Dialog_Data *cfdata;
435    E_Config_Binding_Acpi *binding;
436    E_Action_Description *dsc;
437
438    if (!(cfdata = data)) return;
439    e_widget_entry_clear(cfdata->o_params);
440    if (!(binding = _selected_binding_get(cfdata)))
441      {
442         e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
443         e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
444         return;
445      }
446    if (!(dsc = _selected_action_get(cfdata)))
447      {
448         e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
449         return;
450      }
451
452    eina_stringshare_replace(&binding->action, dsc->act_cmd);
453    e_widget_disabled_set(cfdata->o_params, !(dsc->editable));
454
455    if ((!dsc->editable) && (dsc->act_params))
456      e_widget_entry_text_set(cfdata->o_params, dsc->act_params);
457    else if (binding->params)
458      e_widget_entry_text_set(cfdata->o_params, binding->params);
459    else
460      {
461         if ((!dsc->param_example) || (!dsc->param_example[0]))
462           e_widget_entry_text_set(cfdata->o_params, _("<None>"));
463         else
464           e_widget_entry_text_set(cfdata->o_params, dsc->param_example);
465      }
466 }
467
468 static void
469 _cb_entry_changed(void *data,
470                   void *data2 __UNUSED__)
471 {
472    E_Config_Dialog_Data *cfdata;
473    E_Config_Binding_Acpi *binding;
474    E_Action_Description *dsc;
475
476    if (!(cfdata = data)) return;
477    if (!(dsc = _selected_action_get(cfdata))) return;
478    if (!dsc->editable) return;
479    if (!(binding = _selected_binding_get(cfdata))) return;
480    eina_stringshare_replace(&binding->params,
481                             e_widget_entry_text_get(cfdata->o_params));
482 }
483
484 static void
485 _cb_add_binding(void *data,
486                 void *data2 __UNUSED__)
487 {
488    E_Config_Dialog_Data *cfdata;
489    E_Manager *man;
490
491    if (grab_win != 0) return;
492    if (!(cfdata = data)) return;
493    man = e_manager_current_get();
494    grab_dlg = e_dialog_new(e_container_current_get(man), "E",
495                            "_acpibind_getbind_dialog");
496    if (!grab_dlg) return;
497    e_dialog_title_set(grab_dlg, _("ACPI Binding"));
498    e_dialog_icon_set(grab_dlg, "preferences-system-power-management", 48);
499    e_dialog_text_set(grab_dlg,
500                      _("Please trigger the ACPI event you wish to bind to, "
501                        "<br><br>or <hilight>Escape</hilight> to abort."));
502    e_win_centered_set(grab_dlg->win, EINA_TRUE);
503    e_win_borderless_set(grab_dlg->win, EINA_TRUE);
504
505    grab_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1);
506    ecore_x_window_show(grab_win);
507    e_grabinput_get(grab_win, 0, grab_win);
508
509    grab_hdls =
510      eina_list_append(grab_hdls,
511                       ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
512                                               _cb_grab_key_down, cfdata));
513    grab_hdls =
514      eina_list_append(grab_hdls,
515                       ecore_event_handler_add(E_EVENT_ACPI,
516                                               _cb_acpi_event, cfdata));
517
518    /* freeze all incoming acpi events */
519    e_acpi_events_freeze();
520
521    e_dialog_show(grab_dlg);
522    ecore_x_icccm_transient_for_set(grab_dlg->win->evas_win,
523                                    cfdata->cfd->dia->win->evas_win);
524 }
525
526 static void
527 _cb_del_binding(void *data,
528                 void *data2 __UNUSED__)
529 {
530    E_Config_Dialog_Data *cfdata;
531    E_Config_Binding_Acpi *binding, *bind2;
532    Eina_List *l;
533
534    if (!(cfdata = data)) return;
535    if (!(binding = _selected_binding_get(cfdata))) return;
536
537    /* delete from e_config */
538    EINA_LIST_FOREACH(e_config->acpi_bindings, l, bind2)
539      {
540         if ((binding->context == bind2->context) && (binding->type == bind2->type) &&
541             (((binding->action) && (bind2->action) &&
542               (!strcmp(binding->action, bind2->action))) ||
543              ((!binding->action) && (!bind2->action))) &&
544             (((binding->params) && (bind2->params) &&
545               (!strcmp(binding->params, bind2->params))) ||
546              ((!binding->params) && (!bind2->params))))
547           {
548              if (bind2->action) eina_stringshare_del(bind2->action);
549              if (bind2->params) eina_stringshare_del(bind2->params);
550              E_FREE(bind2);
551              e_config->acpi_bindings =
552                eina_list_remove_list(e_config->acpi_bindings, l);
553              e_config_save_queue();
554              break;
555           }
556      }
557
558    /* delete from e_bindings */
559    e_bindings_acpi_del(binding->context, binding->type, binding->status,
560                        binding->action, binding->params);
561
562    /* delete from dialog list */
563    EINA_LIST_FOREACH(cfdata->bindings, l, bind2)
564      {
565         if ((binding->context == bind2->context) && (binding->type == bind2->type) &&
566             (((binding->action) && (bind2->action) &&
567               (!strcmp(binding->action, bind2->action))) ||
568              ((!binding->action) && (!bind2->action))) &&
569             (((binding->params) && (bind2->params) &&
570               (!strcmp(binding->params, bind2->params))) ||
571              ((!binding->params) && (!bind2->params))))
572           {
573              if (bind2->action) eina_stringshare_del(bind2->action);
574              if (bind2->params) eina_stringshare_del(bind2->params);
575              E_FREE(bind2);
576              cfdata->bindings = eina_list_remove_list(cfdata->bindings, l);
577              break;
578           }
579      }
580
581    /* reset gui */
582    e_widget_entry_clear(cfdata->o_params);
583    e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
584    e_widget_ilist_unselect(cfdata->o_actions);
585    e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
586    _fill_bindings(cfdata);
587 }
588
589 static Eina_Bool
590 _cb_grab_key_down(void *data,
591                   int type __UNUSED__,
592                   void *event)
593 {
594    E_Config_Dialog_Data *cfdata;
595    Ecore_Event_Key *ev;
596
597    ev = event;
598    if (ev->window != grab_win) return ECORE_CALLBACK_PASS_ON;
599    if (!(cfdata = data)) return ECORE_CALLBACK_PASS_ON;
600    if (!strcmp(ev->keyname, "Escape"))
601      {
602         Ecore_Event_Handler *hdl;
603
604         /* free the handlers */
605         EINA_LIST_FREE(grab_hdls, hdl)
606           ecore_event_handler_del(hdl);
607
608         /* kill the dialog window */
609         e_grabinput_release(grab_win, grab_win);
610         ecore_x_window_free(grab_win);
611         grab_win = 0;
612         e_object_del(E_OBJECT(grab_dlg));
613         grab_dlg = NULL;
614
615         /* unfreeze acpi events */
616         e_acpi_events_thaw();
617      }
618    return ECORE_CALLBACK_PASS_ON;
619 }
620
621 static Eina_Bool
622 _cb_acpi_event(void *data,
623                __UNUSED__ int type,
624                void *event)
625 {
626    E_Event_Acpi *ev;
627    E_Config_Dialog_Data *cfdata;
628    E_Config_Binding_Acpi *binding;
629    Ecore_Event_Handler *hdl;
630
631    ev = event;
632    if (!(cfdata = data)) return ECORE_CALLBACK_PASS_ON;
633
634    /* free the handlers */
635    EINA_LIST_FREE(grab_hdls, hdl)
636      ecore_event_handler_del(hdl);
637
638    /* kill the dialog window */
639    e_grabinput_release(grab_win, grab_win);
640    ecore_x_window_free(grab_win);
641    grab_win = 0;
642    e_object_del(E_OBJECT(grab_dlg));
643    grab_dlg = NULL;
644
645    /* unfreeze acpi events */
646    e_acpi_events_thaw();
647
648    /* NB: This may need more testing/parsing for event status */
649    binding = E_NEW(E_Config_Binding_Acpi, 1);
650    binding->context = E_BINDING_CONTEXT_NONE;
651    binding->type = ev->type;
652    binding->status = ev->status;
653    binding->action = eina_stringshare_add("dim_screen");
654    binding->params = NULL;
655
656    cfdata->bindings = eina_list_append(cfdata->bindings, binding);
657    _fill_bindings(cfdata);
658    return ECORE_CALLBACK_DONE;
659 }
660