This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch feature/nm-vpn-support
in repository enlightenment.
View the commit online.
commit cd61a8c46aa7d3478feb8ff0cdff1de49f748a22
Author: Carsten Haitzler <[email protected]>
AuthorDate: Mon May 18 14:05:23 2026 +0100
nm - add poll interval settings dialog with config loaded/saved
now you can set the poll interval in settings .. and the changes work
on the fly and it saves/loads them.
---
src/modules/networkmanager/e_mod_config.c | 135 ++++++++++++++++++++++++++++
src/modules/networkmanager/e_mod_main.c | 143 ++++++++++++++++++++++++++----
src/modules/networkmanager/e_mod_main.h | 16 ++++
src/modules/networkmanager/meson.build | 1 +
4 files changed, 276 insertions(+), 19 deletions(-)
diff --git a/src/modules/networkmanager/e_mod_config.c b/src/modules/networkmanager/e_mod_config.c
new file mode 100644
index 000000000..3dd2f2cbb
--- /dev/null
+++ b/src/modules/networkmanager/e_mod_config.c
@@ -0,0 +1,135 @@
+#include "e.h"
+#include "e_mod_main.h"
+
+typedef struct _E_Config_Dialog_Data
+{
+ E_Config_Dialog *cfd;
+ double poll_time;
+} E_Config_Dialog_Data;
+
+static void *_create_data(E_Config_Dialog *cfd);
+static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
+static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas,
+ E_Config_Dialog_Data *cfdata);
+static int _basic_apply_data(E_Config_Dialog *cfd,
+ E_Config_Dialog_Data *cfdata);
+static int _basic_check_changed(E_Config_Dialog *cfd,
+ E_Config_Dialog_Data *cfdata);
+
+E_Config_Dialog *
+e_int_config_networkmanager_module(Evas_Object *parent EINA_UNUSED,
+ const char *params EINA_UNUSED)
+{
+ E_Config_Dialog *cfd;
+ E_Config_Dialog_View *v;
+
+ if (!networkmanager_config) return NULL;
+ if (networkmanager_config->config_dialog)
+ return networkmanager_config->config_dialog;
+
+ v = E_NEW(E_Config_Dialog_View, 1);
+ v->create_cfdata = _create_data;
+ v->free_cfdata = _free_data;
+ v->basic.apply_cfdata = _basic_apply_data;
+ v->basic.create_widgets = _basic_create_widgets;
+ v->basic.check_changed = _basic_check_changed;
+
+ cfd = e_config_dialog_new(NULL, _("NetworkManager Settings"),
+ "E", "_e_mod_networkmanager_config_dialog",
+ "preferences-network", 0, v, NULL);
+ networkmanager_config->config_dialog = cfd;
+ return cfd;
+}
+
+static void
+_fill_data(E_Config_Dialog_Data *cfdata)
+{
+ if (!networkmanager_config) return;
+ cfdata->poll_time = networkmanager_config->poll_time;
+}
+
+static void *
+_create_data(E_Config_Dialog *cfd EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata;
+
+ cfdata = E_NEW(E_Config_Dialog_Data, 1);
+ _fill_data(cfdata);
+ return cfdata;
+}
+
+static void
+_free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
+{
+ if (networkmanager_config) networkmanager_config->config_dialog = NULL;
+ E_FREE(cfdata);
+}
+
+static void
+_cb_interval_slider(void *data, Evas_Object *obj, void *info EINA_UNUSED)
+{
+ E_Config_Dialog_Data *cfdata = data;
+
+ cfdata->poll_time = elm_slider_value_get(obj);
+ e_config_dialog_changed_set(cfdata->cfd, EINA_TRUE);
+}
+
+static Evas_Object *
+_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED,
+ E_Config_Dialog_Data *cfdata)
+{
+ Evas_Object *win, *table, *obj;
+
+ win = cfd->dia->win;
+ table = elm_table_add(e_comp->elm);
+
+ obj = elm_icon_add(win);
+ elm_icon_standard_set(obj, "clock");
+ evas_object_size_hint_min_set(obj, ELM_SCALE_SIZE(20), ELM_SCALE_SIZE(20));
+ elm_table_pack(table, obj, 0, 0, 1, 1);
+ evas_object_show(obj);
+
+ obj = elm_label_add(win);
+ elm_object_text_set(obj, _("Update Interval"));
+ evas_object_size_hint_align_set(obj, 0.0, 0.5);
+ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0.0);
+ elm_table_pack(table, obj, 1, 0, 9, 1);
+ evas_object_show(obj);
+
+ obj = elm_slider_add(win);
+ elm_slider_span_size_set(obj, ELM_SCALE_SIZE(160));
+ elm_slider_horizontal_set(obj, EINA_TRUE);
+ elm_slider_min_max_set(obj, 0.1, 10.0);
+ elm_slider_step_set(obj, 0.1);
+ elm_slider_indicator_show_set(obj, EINA_FALSE);
+ elm_slider_unit_format_set(obj, "%1.1f sec");
+ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0.5);
+ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0.0);
+ elm_table_pack(table, obj, 0, 1, 10, 1);
+ elm_slider_value_set(obj, cfdata->poll_time);
+ evas_object_smart_callback_add(obj, "changed", _cb_interval_slider, cfdata);
+ evas_object_show(obj);
+
+ cfdata->cfd = cfd;
+ return table;
+}
+
+static int
+_basic_apply_data(E_Config_Dialog *cfd EINA_UNUSED,
+ E_Config_Dialog_Data *cfdata)
+{
+ if (!networkmanager_config) return 0;
+
+ networkmanager_config->poll_time = cfdata->poll_time;
+ enm_config_poll_time_set(networkmanager_config->poll_time);
+ e_config_save_queue();
+ return 1;
+}
+
+static int
+_basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED,
+ E_Config_Dialog_Data *cfdata)
+{
+ if (!networkmanager_config) return 0;
+ return (fabs(cfdata->poll_time - networkmanager_config->poll_time) > 0.01);
+}
diff --git a/src/modules/networkmanager/e_mod_main.c b/src/modules/networkmanager/e_mod_main.c
index 01788f610..9f40e04a5 100644
--- a/src/modules/networkmanager/e_mod_main.c
+++ b/src/modules/networkmanager/e_mod_main.c
@@ -3,7 +3,9 @@
#include "e_networkmanager.h"
E_Module *networkmanager_mod = NULL;
+E_NM_Config *networkmanager_config = NULL;
static Eina_Stringshare *_theme_path = NULL;
+static E_Config_DD *conf_edd = NULL;
const char _e_nm_name[] = "networkmanager";
const char _e_nm_Name[] = N_("NetworkManager");
@@ -12,6 +14,19 @@ int _e_nm_log_dom = -1;
/* Forward declarations for traffic monitor */
static void _enm_traffic_timer_start(E_NM_Module_Context *ctxt);
static void _enm_traffic_timer_stop(E_NM_Module_Context *ctxt);
+static void _enm_configure_registry_register(void);
+static void _enm_configure_registry_unregister(void);
+
+typedef struct _Enm_Traffic_Worker
+{
+ E_NM_Module_Context *ctxt;
+ char *iface; /* strdup; worker-only read */
+ Eina_Lock lock;
+ unsigned long long rx;
+ unsigned long long tx;
+ int pipe_fd;
+ Eina_Bool have_sample : 1;
+} Enm_Traffic_Worker;
static void
_enm_poll_wake(E_NM_Module_Context *ctxt)
@@ -21,6 +36,37 @@ _enm_poll_wake(E_NM_Module_Context *ctxt)
if (ctxt->pipe) ecore_pipe_write(ctxt->pipe, buf, 1);
}
+void
+enm_config_poll_time_set(double tim)
+{
+ E_NM_Module_Context *ctxt;
+
+ if (!networkmanager_mod) return;
+
+ ctxt = networkmanager_mod->data;
+ if (!ctxt) return;
+
+ ctxt->poll_time = tim;
+ if (ctxt->worker)
+ {
+ Enm_Traffic_Worker *w = ctxt->worker;
+
+ eina_lock_take(&w->lock);
+ if (w->ctxt) w->ctxt->poll_time = tim;
+ eina_lock_release(&w->lock);
+ }
+ _enm_poll_wake(ctxt);
+}
+
+void
+enm_config_dialog_show(E_NM_Instance *inst)
+{
+ if (!networkmanager_config) return;
+ if (networkmanager_config->config_dialog) return;
+ if (inst && inst->popup) enm_popup_del(inst);
+ e_int_config_networkmanager_module(NULL, NULL);
+}
+
/* Try our own theme first, fall back to connman's so the gadget keeps working
* on installs that only ship the legacy theme. */
static Eina_Bool
@@ -99,6 +145,13 @@ _enm_popup_del(void *data, Evas_Object *obj EINA_UNUSED)
E_FREE_FUNC(inst->popup, e_object_del);
}
+static void
+_enm_popup_settings_cb(void *data, Evas_Object *obj EINA_UNUSED,
+ void *info EINA_UNUSED)
+{
+ enm_config_dialog_show(data);
+}
+
static Eina_Bool _enm_ssid_is_active(struct NM_Manager *nm, const char *ssid);
@@ -813,7 +866,7 @@ static void
_enm_popup_new(E_NM_Instance *inst)
{
E_NM_Module_Context *ctxt = inst->ctxt;
- Evas_Object *box, *gl;
+ Evas_Object *box, *button, *gl, *icon;
Elm_Genlist_Item_Class *itc;
EINA_SAFETY_ON_FALSE_RETURN(inst->popup == NULL);
@@ -886,6 +939,20 @@ _enm_popup_new(E_NM_Instance *inst)
elm_box_pack_end(box, inst->ui.popup.ip_label);
evas_object_show(inst->ui.popup.ip_label);
+ button = elm_button_add(box);
+ elm_object_text_set(button, _("Settings"));
+ evas_object_size_hint_align_set(button, 0.5, 0.5);
+ evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0.0);
+ evas_object_smart_callback_add(button, "clicked",
+ _enm_popup_settings_cb, inst);
+ elm_box_pack_end(box, button);
+ evas_object_show(button);
+
+ icon = elm_icon_add(button);
+ elm_icon_standard_set(icon, "preferences-system");
+ elm_object_content_set(button, icon);
+ evas_object_show(icon);
+
evas_object_show(box);
_enm_popup_update(ctxt->nm, inst);
@@ -1275,17 +1342,6 @@ _enm_traffic_signal_emit(E_NM_Module_Context *ctxt, int rx_level, int tx_level)
* then reassigned to the new thread, so the old thread's delayed done cb
* finds a pointer that is either NULL or the new thread and leaves it alone.
*/
-typedef struct _Enm_Traffic_Worker
-{
- E_NM_Module_Context *ctxt;
- char *iface; /* strdup; worker-only read */
- Eina_Lock lock;
- unsigned long long rx;
- unsigned long long tx;
- int pipe_fd;
- Eina_Bool have_sample : 1;
-} Enm_Traffic_Worker;
-
static void
_enm_traffic_worker_heavy(void *data, Ecore_Thread *thread)
{
@@ -1345,6 +1401,7 @@ _enm_traffic_worker_notify(void *data, Ecore_Thread *thread EINA_UNUSED,
E_NM_Module_Context *ctxt = w->ctxt;
unsigned long long rx, tx;
int rx_level, tx_level;
+ double divide;
Eina_Bool have;
eina_lock_take(&w->lock);
@@ -1366,8 +1423,10 @@ _enm_traffic_worker_notify(void *data, Ecore_Thread *thread EINA_UNUSED,
}
/* Poll interval ~0.5s, so bytes_per_sec = delta * 2 */
- rx_level = _enm_traffic_level((rx - ctxt->prev_rx) * 2, ctxt->rx_level);
- tx_level = _enm_traffic_level((tx - ctxt->prev_tx) * 2, ctxt->tx_level);
+ divide = ctxt->poll_time;
+ if (divide < 0.1) divide = 0.1;
+ rx_level = _enm_traffic_level((rx - ctxt->prev_rx) / divide, ctxt->rx_level);
+ tx_level = _enm_traffic_level((tx - ctxt->prev_tx) / divide, ctxt->tx_level);
ctxt->prev_rx = rx;
ctxt->prev_tx = tx;
@@ -1450,13 +1509,13 @@ _enm_traffic_timer_start(E_NM_Module_Context *ctxt)
w = E_NEW(Enm_Traffic_Worker, 1);
w->ctxt = ctxt;
w->iface = strdup(iface);
- w->pipe_fd = ctxt->pipe_fd; // store fd local to worker thread
ctxt->worker = w;
eina_lock_new(&w->lock);
ctxt->pipe = ecore_pipe_add(_cb_pipe_dummy, NULL);
if (ctxt->pipe) ecore_pipe_freeze(ctxt->pipe);
if (ctxt->pipe) ctxt->pipe_fd = ecore_pipe_read_fd(ctxt->pipe);
else ctxt->pipe_fd = -1;
+ w->pipe_fd = ctxt->pipe_fd; // store fd local to worker thread
ctxt->traffic_thread =
ecore_thread_feedback_run(_enm_traffic_worker_heavy,
_enm_traffic_worker_notify,
@@ -1509,13 +1568,25 @@ _enm_powersave_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
/* --- mouse / menu --------------------------------------------------------- */
+static void
+_enm_cb_menu_configure(void *data, E_Menu *m EINA_UNUSED,
+ E_Menu_Item *mi EINA_UNUSED)
+{
+ enm_config_dialog_show(data);
+}
+
static void
_enm_menu_new(E_NM_Instance *inst, Evas_Event_Mouse_Down *ev)
{
E_Menu *m;
+ E_Menu_Item *mi;
int x, y;
m = e_menu_new();
+ mi = e_menu_item_new(m);
+ e_menu_item_label_set(mi, _("Settings"));
+ e_util_menu_item_theme_icon_set(mi, "configure");
+ e_menu_item_callback_set(mi, _enm_cb_menu_configure, inst);
m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL);
e_menu_activate_mouse(m,
@@ -1662,7 +1733,8 @@ _enm_configure_registry_register(void)
e_configure_registry_category_add(_reg_cat, 90, _("Extensions"), NULL,
"preferences-extensions");
e_configure_registry_item_add(_reg_item, 111, _(_e_nm_Name), NULL,
- "preferences-network", NULL);
+ "preferences-network",
+ e_int_config_networkmanager_module);
}
static void
@@ -1679,6 +1751,30 @@ e_modapi_init(E_Module *m)
{
E_NM_Module_Context *ctxt;
+ conf_edd = E_CONFIG_DD_NEW("NetworkManager_Config", E_NM_Config);
+#undef T
+#undef D
+#define T E_NM_Config
+#define D conf_edd
+ E_CONFIG_VAL(D, T, config_version, INT);
+ E_CONFIG_VAL(D, T, poll_time, DOUBLE);
+
+ networkmanager_config = e_config_domain_load("module.networkmanager",
+ conf_edd);
+ if ((networkmanager_config) &&
+ (networkmanager_config->config_version != NETWORKMANAGER_CONFIG_VERSION))
+ E_FREE(networkmanager_config);
+
+ if (!networkmanager_config)
+ {
+ networkmanager_config = E_NEW(E_NM_Config, 1);
+ if (!networkmanager_config) goto error_config;
+ networkmanager_config->config_version = NETWORKMANAGER_CONFIG_VERSION;
+ networkmanager_config->poll_time = 0.5;
+ }
+ E_CONFIG_LIMIT(networkmanager_config->poll_time, 0.1, 10.0);
+ networkmanager_config->module = m;
+
if (_e_nm_log_dom < 0)
{
_e_nm_log_dom = eina_log_domain_register("networkmanager",
@@ -1694,9 +1790,7 @@ e_modapi_init(E_Module *m)
if (!ctxt) goto error_nm_context;
ctxt->pipe_fd = -1;
- ctxt->poll_time = 0.5; // XXX: make this gui config
- // also any future changes to this require taking a lock on
- // ctxt->worker->lock while changing and then a _enm_poll_wake(ctxt)
+ ctxt->poll_time = networkmanager_config->poll_time;
e_nm_module_callbacks_set(&_enm_mod_cbs);
enm_agent_ui_register();
@@ -1723,6 +1817,9 @@ error_nm_context:
eina_log_domain_unregister(_e_nm_log_dom);
error_log_domain:
_e_nm_log_dom = -1;
+ E_FREE(networkmanager_config);
+error_config:
+ E_CONFIG_DD_FREE(conf_edd);
return NULL;
}
@@ -1767,6 +1864,11 @@ e_modapi_shutdown(E_Module *m)
eina_stringshare_replace(&_theme_path, NULL);
+ if (networkmanager_config && networkmanager_config->config_dialog)
+ e_object_del(E_OBJECT(networkmanager_config->config_dialog));
+ E_FREE(networkmanager_config);
+ E_CONFIG_DD_FREE(conf_edd);
+
eina_log_domain_unregister(_e_nm_log_dom);
_e_nm_log_dom = -1;
@@ -1780,5 +1882,8 @@ e_modapi_save(E_Module *m)
ctxt = m->data;
if (!ctxt) return 0;
+ if (!networkmanager_config) return 0;
+ e_config_domain_save("module.networkmanager", conf_edd,
+ networkmanager_config);
return 1;
}
diff --git a/src/modules/networkmanager/e_mod_main.h b/src/modules/networkmanager/e_mod_main.h
index d99aa4a4d..bcb31e672 100644
--- a/src/modules/networkmanager/e_mod_main.h
+++ b/src/modules/networkmanager/e_mod_main.h
@@ -6,12 +6,22 @@
#include "e_networkmanager.h"
#define AGENT_PATH "/org/freedesktop/NetworkManager/SecretAgent"
+#define NETWORKMANAGER_CONFIG_VERSION 1
extern E_Module *networkmanager_mod;
extern int _e_nm_log_dom;
typedef struct E_NM_Instance E_NM_Instance;
typedef struct E_NM_Module_Context E_NM_Module_Context;
+typedef struct E_NM_Config E_NM_Config;
+
+struct E_NM_Config
+{
+ int config_version;
+ double poll_time;
+ E_Config_Dialog *config_dialog;
+ E_Module *module;
+};
struct E_NM_Instance
{
@@ -68,13 +78,19 @@ E_API void *e_modapi_init(E_Module *m);
E_API int e_modapi_shutdown(E_Module *m);
E_API int e_modapi_save(E_Module *m);
+E_Config_Dialog *e_int_config_networkmanager_module(Evas_Object *parent,
+ const char *params);
void enm_popup_del(E_NM_Instance *inst);
void enm_mod_aps_update_now(void);
+void enm_config_dialog_show(E_NM_Instance *inst);
+void enm_config_poll_time_set(double tim);
const char *e_nm_theme_path(void);
/* Register the password-dialog UI callbacks with the agent subsystem. */
void enm_agent_ui_register(void);
+extern E_NM_Config *networkmanager_config;
+
/**
* @addtogroup Optional_Devices
* @{
diff --git a/src/modules/networkmanager/meson.build b/src/modules/networkmanager/meson.build
index a691dd4da..994749d2b 100644
--- a/src/modules/networkmanager/meson.build
+++ b/src/modules/networkmanager/meson.build
@@ -1,5 +1,6 @@
src = ""
'e_mod_main.c',
+ 'e_mod_config.c',
'agent.c',
'e_networkmanager.c',
'e_networkmanager.h',
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.