diff --git a/src/e_mod_config.c b/src/e_mod_config.c index 6e7176a..50bfdd6 100644 --- a/src/e_mod_config.c +++ b/src/e_mod_config.c @@ -48,9 +48,99 @@ e_iwd_config_save(void) e_config_domain_save(CONFIG_DOMAIN, _edd, e_iwd_config); } +/* ----- Settings dialog ------------------------------------------------ */ + +struct _E_Config_Dialog_Data +{ + int auto_connect; + int show_hidden; + int refresh_interval; + char *preferred_adapter; +}; + +static void * +_cfd_create(E_Config_Dialog *cfd EINA_UNUSED) +{ + if (!e_iwd_config) return NULL; + E_Config_Dialog_Data *c = E_NEW(E_Config_Dialog_Data, 1); + c->auto_connect = e_iwd_config->auto_connect; + c->show_hidden = e_iwd_config->show_hidden; + c->refresh_interval = e_iwd_config->refresh_interval; + c->preferred_adapter = e_iwd_config->preferred_adapter + ? strdup(e_iwd_config->preferred_adapter) : strdup(""); + return c; +} + +static void +_cfd_free(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *c) +{ + if (!c) return; + free(c->preferred_adapter); + E_FREE(c); +} + +static Evas_Object * +_cfd_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *c) +{ + Evas_Object *o, *of, *ob; + o = e_widget_list_add(evas, 0, 0); + + of = e_widget_framelist_add(evas, "Connection", 0); + ob = e_widget_check_add(evas, "Auto-connect to known networks", + &c->auto_connect); + e_widget_framelist_object_append(of, ob); + ob = e_widget_check_add(evas, "Show hidden networks", + &c->show_hidden); + e_widget_framelist_object_append(of, ob); + e_widget_list_object_append(o, of, 1, 1, 0.5); + + of = e_widget_framelist_add(evas, "Performance", 0); + ob = e_widget_label_add(evas, "Signal refresh interval (s):"); + e_widget_framelist_object_append(of, ob); + ob = e_widget_slider_add(evas, 1, 0, "%1.0f", 1.0, 60.0, 1.0, 0, + NULL, &c->refresh_interval, 150); + e_widget_framelist_object_append(of, ob); + e_widget_list_object_append(o, of, 1, 1, 0.5); + + of = e_widget_framelist_add(evas, "Adapter", 0); + ob = e_widget_label_add(evas, "Preferred wireless adapter (blank = auto):"); + e_widget_framelist_object_append(of, ob); + ob = e_widget_entry_add(evas, &c->preferred_adapter, NULL, NULL, NULL); + e_widget_framelist_object_append(of, ob); + e_widget_list_object_append(o, of, 1, 1, 0.5); + + return o; +} + +static int +_cfd_basic_apply(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *c) +{ + if (!e_iwd_config || !c) return 0; + e_iwd_config->auto_connect = c->auto_connect; + e_iwd_config->show_hidden = c->show_hidden; + e_iwd_config->refresh_interval = c->refresh_interval; + if (e_iwd_config->preferred_adapter) + eina_stringshare_del(e_iwd_config->preferred_adapter); + e_iwd_config->preferred_adapter = + (c->preferred_adapter && *c->preferred_adapter) + ? eina_stringshare_add(c->preferred_adapter) : NULL; + e_iwd_config_save(); + return 1; +} + void e_iwd_config_dialog_show(void) { - /* TODO: full E_Config_Dialog with checkboxes/spinners. - * Settings are persisted; only the GUI is missing. */ + if (e_config_dialog_find("E_Iwd", "extensions/iwd")) return; + + E_Config_Dialog_View *v = E_NEW(E_Config_Dialog_View, 1); + if (!v) return; + v->create_cfdata = _cfd_create; + v->free_cfdata = _cfd_free; + v->basic.create_widgets = _cfd_basic_create; + v->basic.apply_cfdata = _cfd_basic_apply; + + E_Config_Dialog *cfd = e_config_dialog_new(NULL, + "iwd Wi-Fi Settings", "E_Iwd", "extensions/iwd", NULL, 0, v, NULL); + if (!cfd) E_FREE(v); }