diff --git a/src/modules/conf_acpibindings/e_int_config_acpibindings.c b/src/modules/conf_acpibindings/e_int_config_acpibindings.c index 194dfacf7..80676a303 100644 --- a/src/modules/conf_acpibindings/e_int_config_acpibindings.c +++ b/src/modules/conf_acpibindings/e_int_config_acpibindings.c @@ -3,14 +3,23 @@ /* local config structure */ struct _E_Config_Dialog_Data { - + Eina_List *bindings; + Evas_Object *o_bindings, *o_actions; }; /* local function prototypes */ static void *_create_data(E_Config_Dialog *cfd); +static void _fill_data(E_Config_Dialog_Data *cfdata); static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static void _fill_bindings(E_Config_Dialog_Data *cfdata); +static void _fill_actions(E_Config_Dialog_Data *cfdata); +static E_Config_Binding_Acpi *_selected_binding_get(E_Config_Dialog_Data *cfdata); +static E_Action_Description *_selected_action_get(E_Config_Dialog_Data *cfdata); +static const char *_binding_get_label(E_Config_Binding_Acpi *bind); +static void _cb_bindings_changed(void *data); +static void _cb_actions_changed(void *data); E_Config_Dialog * e_int_config_acpibindings(E_Container *con, const char *params __UNUSED__) @@ -18,7 +27,7 @@ e_int_config_acpibindings(E_Container *con, const char *params __UNUSED__) E_Config_Dialog *cfd; E_Config_Dialog_View *v; - if (e_config_dialog_find("E", "keyboard_and_mouse/acpi_bindings")) + if (e_config_dialog_find("E", "system/acpi_bindings")) return NULL; v = E_NEW(E_Config_Dialog_View, 1); @@ -28,8 +37,8 @@ e_int_config_acpibindings(E_Container *con, const char *params __UNUSED__) v->basic.create_widgets = _basic_create; cfd = e_config_dialog_new(con, _("ACPI Bindings"), "E", - "keyboard_and_mouse/acpi_bindings", - "preferences-desktop-keyboard-shortcuts", + "system/acpi_bindings", + "preferences-system-power-management", 0, v, NULL); return cfd; @@ -42,18 +51,71 @@ _create_data(E_Config_Dialog *cfd) E_Config_Dialog_Data *cfdata; cfdata = E_NEW(E_Config_Dialog_Data, 1); + _fill_data(cfdata); return cfdata; } +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ + Eina_List *l; + E_Config_Binding_Acpi *bind; + + EINA_LIST_FOREACH(e_config->acpi_bindings, l, bind) + { + E_Config_Binding_Acpi *b2; + + b2 = E_NEW(E_Config_Binding_Acpi, 1); + b2->context = bind->context; + b2->type = bind->type; + b2->status = bind->status; + b2->action = eina_stringshare_ref(bind->action); + b2->params = eina_stringshare_ref(bind->params); + cfdata->bindings = eina_list_append(cfdata->bindings, b2); + } +} + static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { + E_Config_Binding_Acpi *bind; + + EINA_LIST_FREE(cfdata->bindings, bind) + { + if (bind->action) eina_stringshare_del(bind->action); + if (bind->params) eina_stringshare_del(bind->params); + E_FREE(bind); + } + E_FREE(cfdata); } static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { + E_Config_Binding_Acpi *bind, *b2; + Eina_List *l; + + EINA_LIST_FREE(e_config->acpi_bindings, bind) + e_bindings_acpi_del(bind->context, bind->type, bind->status, + bind->action, bind->params); + + EINA_LIST_FOREACH(cfdata->bindings, l, bind) + { + b2 = E_NEW(E_Config_Binding_Acpi, 1); + b2->context = bind->context; + b2->type = bind->type; + b2->status = bind->status; + b2->action = eina_stringshare_ref(bind->action); + b2->params = eina_stringshare_ref(bind->params); + e_config->acpi_bindings = + eina_list_append(e_config->acpi_bindings, b2); + + e_bindings_acpi_add(b2->context, b2->type, b2->status, + b2->action, b2->params); + } + e_config_save_queue(); + return 1; } @@ -66,15 +128,203 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) of = e_widget_frametable_add(evas, _("ACPI Bindings"), 0); ow = e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale), NULL); - e_widget_size_min_set(ow, 200, 200); + cfdata->o_bindings = ow; + _fill_bindings(cfdata); e_widget_frametable_object_append(of, ow, 0, 0, 2, 1, 1, 1, 1, 1); e_widget_list_object_append(ol, of, 1, 1, 0.5); - of = e_widget_framelist_add(evas, _("Action"), 0); + of = e_widget_framelist_add(evas, _("Actions"), 0); ow = e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale), NULL); - e_widget_size_min_set(ow, 200, 200); + cfdata->o_actions = ow; + _fill_actions(cfdata); e_widget_framelist_object_append(of, ow); e_widget_list_object_append(ol, of, 1, 1, 0.5); return ol; } + +static void +_fill_bindings(E_Config_Dialog_Data *cfdata) +{ + Evas *evas; + Eina_List *l; + E_Config_Binding_Acpi *bind; + int i = -1, mw; + + evas = evas_object_evas_get(cfdata->o_bindings); + evas_event_freeze(evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->o_bindings); + e_widget_ilist_clear(cfdata->o_bindings); + + EINA_LIST_FOREACH(cfdata->bindings, l, bind) + { + const char *lbl; + char buff[32]; + + i++; + if (!(lbl = _binding_get_label(bind))) continue; + snprintf(buff, sizeof(buff), "%d", i); + e_widget_ilist_append(cfdata->o_bindings, NULL, lbl, + _cb_bindings_changed, cfdata, buff); + } + + e_widget_ilist_go(cfdata->o_bindings); + e_widget_size_min_get(cfdata->o_bindings, &mw, NULL); + if (mw < (160 * e_scale)) mw = (160 * e_scale); + e_widget_size_min_set(cfdata->o_bindings, mw, 200); + e_widget_ilist_thaw(cfdata->o_bindings); + edje_thaw(); + evas_event_thaw(evas); +} + +static void +_fill_actions(E_Config_Dialog_Data *cfdata) +{ + Evas *evas; + Eina_List *l, *ll; + E_Action_Group *grp; + E_Action_Description *dsc; + int mw; + + evas = evas_object_evas_get(cfdata->o_actions); + evas_event_freeze(evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->o_actions); + e_widget_ilist_clear(cfdata->o_actions); + + EINA_LIST_FOREACH(e_action_groups_get(), l, grp) + { + if (!grp->acts) continue; + if ((strcmp(grp->act_grp, "Acpi")) && + (strcmp(grp->act_grp, "System"))) continue; + e_widget_ilist_header_append(cfdata->o_actions, NULL, grp->act_grp); + EINA_LIST_FOREACH(grp->acts, ll, dsc) + e_widget_ilist_append(cfdata->o_actions, NULL, dsc->act_name, + _cb_actions_changed, cfdata, dsc->act_cmd); + } + + e_widget_ilist_go(cfdata->o_actions); + e_widget_size_min_get(cfdata->o_actions, &mw, NULL); + if (mw < (160 * e_scale)) mw = (160 * e_scale); + e_widget_size_min_set(cfdata->o_actions, mw, 200); + e_widget_ilist_thaw(cfdata->o_actions); + edje_thaw(); + evas_event_thaw(evas); +} + +static E_Config_Binding_Acpi * +_selected_binding_get(E_Config_Dialog_Data *cfdata) +{ + E_Config_Binding_Acpi *bind; + int sel; + const char *index; + + if (!cfdata) return NULL; + sel = e_widget_ilist_selected_get(cfdata->o_bindings); + if (sel < 0) return NULL; + if (!(index = e_widget_ilist_nth_value_get(cfdata->o_bindings, sel))) + return NULL; + sel = atoi(index); + if (!(bind = eina_list_nth(cfdata->bindings, sel))) return NULL; + return bind; +} + +static E_Action_Description * +_selected_action_get(E_Config_Dialog_Data *cfdata) +{ + E_Action_Group *grp; + E_Action_Description *dsc; + Eina_List *l, *ll; + const char *lbl; + int sel; + + if (!cfdata) return NULL; + sel = e_widget_ilist_selected_get(cfdata->o_actions); + if (sel < 0) return NULL; + if (!(lbl = e_widget_ilist_nth_label_get(cfdata->o_actions, sel))) + return NULL; + + EINA_LIST_FOREACH(e_action_groups_get(), l, grp) + { + if (!grp->acts) continue; + if ((strcmp(grp->act_grp, "Acpi")) && + (strcmp(grp->act_grp, "System"))) continue; + EINA_LIST_FOREACH(grp->acts, ll, dsc) + { + if ((dsc->act_name) && (!strcmp(dsc->act_name, lbl))) + return dsc; + } + } + + return NULL; +} + +static const char * +_binding_get_label(E_Config_Binding_Acpi *bind) +{ + char *ret; + + if (bind->type == E_ACPI_TYPE_UNKNOWN) return NULL; + else if (bind->type == E_ACPI_TYPE_AC_ADAPTER) + { + ret = _("Ac Adapter"); + if (bind->status == 0) ret = _("AC Adapter Unplugged"); + else if (bind->status == 1) ret = _("AC Adapter Plugged"); + } + else if (bind->type == E_ACPI_TYPE_BATTERY) ret = _("Battery"); + else if (bind->type == E_ACPI_TYPE_BUTTON) ret = _("Button"); + else if (bind->type == E_ACPI_TYPE_FAN) ret = _("Fan"); + else if (bind->type == E_ACPI_TYPE_LID) + { + ret = _("Lid"); + if (bind->status == 0) ret = _("Lid Closed"); + else if (bind->status == 1) ret = _("Lid Opened"); + } + else if (bind->type == E_ACPI_TYPE_POWER) ret = _("Power Button"); + else if (bind->type == E_ACPI_TYPE_PROCESSOR) ret = _("Processor"); + else if (bind->type == E_ACPI_TYPE_SLEEP) ret = _("Sleep Button"); + else if (bind->type == E_ACPI_TYPE_THERMAL) ret = _("Thermal"); + else if (bind->type == E_ACPI_TYPE_VIDEO) ret = _("Video"); + else if (bind->type == E_ACPI_TYPE_WIFI) ret = _("Wifi"); + + return ret; +} + +static void +_cb_bindings_changed(void *data) +{ + E_Config_Dialog_Data *cfdata; + E_Config_Binding_Acpi *bind; + Eina_List *items; + const E_Ilist_Item *item; + int i = -1; + + if (!(cfdata = data)) return; + if (!(bind = _selected_binding_get(cfdata))) return; + e_widget_ilist_unselect(cfdata->o_actions); + EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->o_actions), items, item) + { + const char *val; + + i++; + if (!(val = e_widget_ilist_item_value_get(item))) continue; + if (strcmp(val, bind->action)) continue; + e_widget_ilist_selected_set(cfdata->o_actions, i); + break; + } +} + +static void +_cb_actions_changed(void *data) +{ + E_Config_Dialog_Data *cfdata; + E_Config_Binding_Acpi *bind; + E_Action_Description *dsc; + + if (!(cfdata = data)) return; + if (!(bind = _selected_binding_get(cfdata))) return; + if (!(dsc = _selected_action_get(cfdata))) return; + eina_stringshare_replace(&bind->action, dsc->act_cmd); + eina_stringshare_replace(&bind->params, dsc->act_params); +} diff --git a/src/modules/conf_acpibindings/e_mod_main.c b/src/modules/conf_acpibindings/e_mod_main.c index 1459c8c41..6970c4515 100644 --- a/src/modules/conf_acpibindings/e_mod_main.c +++ b/src/modules/conf_acpibindings/e_mod_main.c @@ -16,11 +16,11 @@ EAPI E_Module_Api e_modapi = EAPI void * e_modapi_init(E_Module *m) { - e_configure_registry_category_add("keyboard_and_mouse", 40, - _("Input"), NULL, "preferences-behavior"); - e_configure_registry_item_add("keyboard_and_mouse/acpi_bindings", 10, + e_configure_registry_category_add("system", 1000, + _("System"), NULL, "preferences-system"); + e_configure_registry_item_add("system/acpi_bindings", 10, _("ACPI Bindings"), NULL, - "preferences-desktop-keyboard-shortcuts", + "preferences-system-power-management", e_int_config_acpibindings); conf_module = m; e_module_delayed_set(m, 1); @@ -32,10 +32,10 @@ e_modapi_shutdown(E_Module *m) { E_Config_Dialog *cfd; - if (cfd = e_config_dialog_get("E", "keyboard_and_mouse/acpi_bindings")) + if (cfd = e_config_dialog_get("E", "system/acpi_bindings")) e_object_del(E_OBJECT(cfd)); - e_configure_registry_item_del("keyboard_and_mouse/acpi_bindings"); - e_configure_registry_category_del("keyboard_and_mouse"); + e_configure_registry_item_del("system/acpi_bindings"); + e_configure_registry_category_del("system"); conf_module = NULL; return 1; } diff --git a/src/modules/conf_acpibindings/module.desktop.in b/src/modules/conf_acpibindings/module.desktop.in index 911a532b0..2b943155d 100644 --- a/src/modules/conf_acpibindings/module.desktop.in +++ b/src/modules/conf_acpibindings/module.desktop.in @@ -3,7 +3,7 @@ Type=Link Name=Settings - ACPI Bindings Name[fr]=Configuration - Raccourcis ACPI Name[it]=Configurazione - Associazioni ACPI -Icon=preferences-desktop-keyboard-shortcuts +Icon=preferences-system-power-management Comment=Configure your ACPI bindings here. Comment[fr]=Permet de configurer vos raccourcis ACPI. Comment[it]=Configurate qui le vostre associazioni con ACPI.