config: implement settings dialog (E_Config_Dialog)

Adds the basic settings UI: auto-connect / show-hidden checkboxes,
signal refresh interval slider, preferred-adapter entry. Apply writes
into e_iwd_config and persists via e_iwd_config_save(). Hooked from
the gadget right-click menu in the next change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
nemunaire 2026-04-09 12:06:48 +07:00
commit dcec367acc

View file

@ -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);
}