eiwd/src/e_mod_config.c
Pierre-Olivier Mercier dcec367acc 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>
2026-04-09 12:47:20 +07:00

146 lines
4.6 KiB
C

#include "e_mod_main.h"
#include "e_mod_config.h"
#include <e_config_data.h>
#define CONFIG_DOMAIN "module.iwd"
#define CONFIG_VERSION 1
E_Iwd_Config *e_iwd_config = NULL;
static E_Config_DD *_edd = NULL;
static void
_edd_setup(void)
{
if (_edd) return;
_edd = E_CONFIG_DD_NEW("E_Iwd_Config", E_Iwd_Config);
E_CONFIG_VAL(_edd, E_Iwd_Config, version, INT);
E_CONFIG_VAL(_edd, E_Iwd_Config, auto_connect, INT);
E_CONFIG_VAL(_edd, E_Iwd_Config, show_hidden, INT);
E_CONFIG_VAL(_edd, E_Iwd_Config, refresh_interval, INT);
E_CONFIG_VAL(_edd, E_Iwd_Config, preferred_adapter, STR);
}
void
e_iwd_config_load(void)
{
_edd_setup();
e_iwd_config = e_config_domain_load(CONFIG_DOMAIN, _edd);
if (e_iwd_config && e_iwd_config->version == CONFIG_VERSION) return;
/* Missing or out-of-date — start fresh with defaults. */
if (e_iwd_config)
{
if (e_iwd_config->preferred_adapter)
eina_stringshare_del(e_iwd_config->preferred_adapter);
free(e_iwd_config);
}
e_iwd_config = E_NEW(E_Iwd_Config, 1);
e_iwd_config->version = CONFIG_VERSION;
e_iwd_config->auto_connect = 1;
e_iwd_config->show_hidden = 0;
e_iwd_config->refresh_interval = 5;
}
void
e_iwd_config_save(void)
{
if (!_edd || !e_iwd_config) return;
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)
{
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);
}