5 * Maybe use a toolbook widget instead of 2 lists ??
6 * Maybe add a way to restore default acpi bindings ??
9 /* local config structure */
10 struct _E_Config_Dialog_Data
13 Evas_Object *o_bindings, *o_actions, *o_params;
14 Evas_Object *o_add, *o_del;
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,
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,
46 static Eina_Bool _cb_acpi_event(void *data,
51 static E_Dialog *grab_dlg = NULL;
52 static Ecore_X_Window grab_win = 0;
53 static Eina_List *grab_hdls = NULL;
56 e_int_config_acpibindings(E_Container *con,
57 const char *params __UNUSED__)
60 E_Config_Dialog_View *v;
62 if ((e_config_dialog_find("E", "advanced/acpi_bindings")))
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;
71 cfd = e_config_dialog_new(con, _("ACPI Bindings"), "E",
72 "advanced/acpi_bindings",
73 "preferences-system-power-management",
81 _create_data(E_Config_Dialog *cfd)
83 E_Config_Dialog_Data *cfdata;
85 cfdata = E_NEW(E_Config_Dialog_Data, 1);
92 _fill_data(E_Config_Dialog_Data *cfdata)
95 E_Config_Binding_Acpi *binding;
97 EINA_LIST_FOREACH(e_config->acpi_bindings, l, binding)
99 E_Config_Binding_Acpi *b2;
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);
112 _free_data(E_Config_Dialog *cfd __UNUSED__,
113 E_Config_Dialog_Data *cfdata)
115 E_Config_Binding_Acpi *binding;
116 Ecore_Event_Handler *hdl;
118 EINA_LIST_FREE(cfdata->bindings, binding)
120 if (binding->action) eina_stringshare_del(binding->action);
121 if (binding->params) eina_stringshare_del(binding->params);
125 /* free the handlers */
126 EINA_LIST_FREE(grab_hdls, hdl)
127 ecore_event_handler_del(hdl);
131 e_grabinput_release(grab_win, grab_win);
132 ecore_x_window_free(grab_win);
138 e_object_del(E_OBJECT(grab_dlg));
139 e_acpi_events_thaw();
147 _basic_apply(E_Config_Dialog *cfd __UNUSED__,
148 E_Config_Dialog_Data *cfdata)
150 E_Config_Binding_Acpi *binding, *b2;
153 EINA_LIST_FREE(e_config->acpi_bindings, binding)
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);
162 EINA_LIST_FOREACH(cfdata->bindings, l, binding)
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);
173 e_bindings_acpi_add(b2->context, b2->type, b2->status,
174 b2->action, b2->params);
176 e_config_save_queue();
182 _basic_create(E_Config_Dialog *cfd,
184 E_Config_Dialog_Data *cfdata)
186 Evas_Object *ol, *of, *ow, *ot;
188 ol = e_widget_list_add(evas, 0, 1);
190 of = e_widget_frametable_add(evas, _("ACPI Bindings"), 0);
191 ow = e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale),
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);
197 ow = e_widget_button_add(evas, _("Add"), "list-add",
198 _cb_add_binding, cfdata, NULL);
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);
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);
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);
216 ow = e_widget_framelist_add(evas, _("Action Params"), 0);
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);
224 e_dialog_resizable_set(cfd->dia, 1);
229 _fill_bindings(E_Config_Dialog_Data *cfdata)
233 E_Config_Binding_Acpi *binding;
236 evas = evas_object_evas_get(cfdata->o_bindings);
237 evas_event_freeze(evas);
239 e_widget_ilist_freeze(cfdata->o_bindings);
240 e_widget_ilist_clear(cfdata->o_bindings);
242 EINA_LIST_FOREACH(cfdata->bindings, l, binding)
248 snprintf(buff, sizeof(buff), "%d", i);
250 lbl = _binding_label_get(binding);
252 e_widget_ilist_append(cfdata->o_bindings, NULL, lbl,
253 _cb_bindings_changed, cfdata, buff);
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);
262 evas_event_thaw(evas);
266 _fill_actions(E_Config_Dialog_Data *cfdata)
271 E_Action_Description *dsc;
274 evas = evas_object_evas_get(cfdata->o_actions);
275 evas_event_freeze(evas);
277 e_widget_ilist_freeze(cfdata->o_actions);
278 e_widget_ilist_clear(cfdata->o_actions);
280 EINA_LIST_FOREACH(e_action_groups_get(), l, grp)
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);
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);
298 evas_event_thaw(evas);
301 static E_Config_Binding_Acpi *
302 _selected_binding_get(E_Config_Dialog_Data *cfdata)
304 E_Config_Binding_Acpi *binding;
306 if ((!cfdata) || (!cfdata->bindex)) return NULL;
307 if (!(binding = eina_list_nth(cfdata->bindings, atoi(cfdata->bindex))))
312 static E_Action_Description *
313 _selected_action_get(E_Config_Dialog_Data *cfdata)
316 E_Action_Description *dsc = NULL;
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)))
327 EINA_LIST_FOREACH(e_action_groups_get(), l, grp)
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)
335 if ((dsc->act_name) && (!strcmp(_(dsc->act_name), lbl)))
344 _binding_label_get(E_Config_Binding_Acpi *binding)
346 if (binding->type == E_ACPI_TYPE_UNKNOWN) return NULL;
347 if (binding->type == E_ACPI_TYPE_AC_ADAPTER)
349 if (binding->status == 0) return _("AC Adapter Unplugged");
350 if (binding->status == 1) return _("AC Adapter Plugged");
351 return _("Ac Adapter");
353 if (binding->type == E_ACPI_TYPE_BATTERY)
355 if (binding->type == E_ACPI_TYPE_BUTTON)
357 if (binding->type == E_ACPI_TYPE_FAN)
359 if (binding->type == E_ACPI_TYPE_LID)
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");
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)
374 if (binding->type == E_ACPI_TYPE_VIDEO)
376 if (binding->type == E_ACPI_TYPE_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)
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)
390 if (binding->type == E_ACPI_TYPE_S1)
392 if (binding->type == E_ACPI_TYPE_VAIO)
399 _cb_bindings_changed(void *data)
401 E_Config_Dialog_Data *cfdata;
402 E_Config_Binding_Acpi *binding;
403 const Eina_List *items;
404 const E_Ilist_Item *item;
407 if (!(cfdata = data)) return;
408 e_widget_entry_clear(cfdata->o_params);
409 if (!(binding = _selected_binding_get(cfdata)))
411 e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
412 e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
416 e_widget_disabled_set(cfdata->o_del, EINA_FALSE);
417 e_widget_ilist_unselect(cfdata->o_actions);
419 EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->o_actions), items, item)
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);
432 _cb_actions_changed(void *data)
434 E_Config_Dialog_Data *cfdata;
435 E_Config_Binding_Acpi *binding;
436 E_Action_Description *dsc;
438 if (!(cfdata = data)) return;
439 e_widget_entry_clear(cfdata->o_params);
440 if (!(binding = _selected_binding_get(cfdata)))
442 e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
443 e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
446 if (!(dsc = _selected_action_get(cfdata)))
448 e_widget_disabled_set(cfdata->o_params, EINA_TRUE);
452 eina_stringshare_replace(&binding->action, dsc->act_cmd);
453 e_widget_disabled_set(cfdata->o_params, !(dsc->editable));
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);
461 if ((!dsc->param_example) || (!dsc->param_example[0]))
462 e_widget_entry_text_set(cfdata->o_params, _("<None>"));
464 e_widget_entry_text_set(cfdata->o_params, dsc->param_example);
469 _cb_entry_changed(void *data,
470 void *data2 __UNUSED__)
472 E_Config_Dialog_Data *cfdata;
473 E_Config_Binding_Acpi *binding;
474 E_Action_Description *dsc;
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));
485 _cb_add_binding(void *data,
486 void *data2 __UNUSED__)
488 E_Config_Dialog_Data *cfdata;
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);
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);
510 eina_list_append(grab_hdls,
511 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
512 _cb_grab_key_down, cfdata));
514 eina_list_append(grab_hdls,
515 ecore_event_handler_add(E_EVENT_ACPI,
516 _cb_acpi_event, cfdata));
518 /* freeze all incoming acpi events */
519 e_acpi_events_freeze();
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);
527 _cb_del_binding(void *data,
528 void *data2 __UNUSED__)
530 E_Config_Dialog_Data *cfdata;
531 E_Config_Binding_Acpi *binding, *bind2;
534 if (!(cfdata = data)) return;
535 if (!(binding = _selected_binding_get(cfdata))) return;
537 /* delete from e_config */
538 EINA_LIST_FOREACH(e_config->acpi_bindings, l, bind2)
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))))
548 if (bind2->action) eina_stringshare_del(bind2->action);
549 if (bind2->params) eina_stringshare_del(bind2->params);
551 e_config->acpi_bindings =
552 eina_list_remove_list(e_config->acpi_bindings, l);
553 e_config_save_queue();
558 /* delete from e_bindings */
559 e_bindings_acpi_del(binding->context, binding->type, binding->status,
560 binding->action, binding->params);
562 /* delete from dialog list */
563 EINA_LIST_FOREACH(cfdata->bindings, l, bind2)
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))))
573 if (bind2->action) eina_stringshare_del(bind2->action);
574 if (bind2->params) eina_stringshare_del(bind2->params);
576 cfdata->bindings = eina_list_remove_list(cfdata->bindings, l);
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);
590 _cb_grab_key_down(void *data,
594 E_Config_Dialog_Data *cfdata;
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"))
602 Ecore_Event_Handler *hdl;
604 /* free the handlers */
605 EINA_LIST_FREE(grab_hdls, hdl)
606 ecore_event_handler_del(hdl);
608 /* kill the dialog window */
609 e_grabinput_release(grab_win, grab_win);
610 ecore_x_window_free(grab_win);
612 e_object_del(E_OBJECT(grab_dlg));
615 /* unfreeze acpi events */
616 e_acpi_events_thaw();
618 return ECORE_CALLBACK_PASS_ON;
622 _cb_acpi_event(void *data,
627 E_Config_Dialog_Data *cfdata;
628 E_Config_Binding_Acpi *binding;
629 Ecore_Event_Handler *hdl;
632 if (!(cfdata = data)) return ECORE_CALLBACK_PASS_ON;
634 /* free the handlers */
635 EINA_LIST_FREE(grab_hdls, hdl)
636 ecore_event_handler_del(hdl);
638 /* kill the dialog window */
639 e_grabinput_release(grab_win, grab_win);
640 ecore_x_window_free(grab_win);
642 e_object_del(E_OBJECT(grab_dlg));
645 /* unfreeze acpi events */
646 e_acpi_events_thaw();
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;
656 cfdata->bindings = eina_list_append(cfdata->bindings, binding);
657 _fill_bindings(cfdata);
658 return ECORE_CALLBACK_DONE;