battery: Add Rudimentary Popup.

Add a popup for battery. It will update if left visible. The popup
avoids polling by using a slightly delayed copy of the battery
state stored in config struct.
This commit is contained in:
Alastair Poole 2020-08-29 16:20:54 +01:00
parent b4264801d0
commit 16bb8e7bd7
2 changed files with 131 additions and 5 deletions

View File

@ -27,16 +27,28 @@ static const E_Gadcon_Client_Class _gadcon_class =
/* actual module specifics */
typedef struct _Instance Instance;
typedef struct __Popup_Data
{
Instance *inst;
Evas_Object *fr;
Evas_Object *pb;
} _Popup_Data;
struct _Instance
{
E_Gadcon_Client *gcc;
Evas_Object *o_battery;
E_Gadcon_Popup *popup;
Ecore_Timer *popup_timer;
_Popup_Data *popup_data;
Evas_Object *popup_battery;
E_Gadcon_Popup *warning;
unsigned int notification_id;
};
static void _battery_update(int full, int time_left, int time_full, Eina_Bool have_battery, Eina_Bool have_power);
static void _battery_update(int full, int time_left, int time_full, Eina_Bool have_battery, Eina_Bool have_power, Eina_Bool charging);
static Eina_Bool _battery_cb_exe_data(void *data, int type, void *event);
static Eina_Bool _battery_cb_exe_del(void *data, int type, void *event);
static void _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
@ -159,6 +171,110 @@ _gc_id_new(const E_Gadcon_Client_Class *client_class)
return buf;
}
static void
_popup_usage_del(Instance *inst)
{
if (inst->popup_timer) ecore_timer_del(inst->popup_timer);
E_FREE_FUNC(inst->popup, e_object_del);
if (inst->popup_data) E_FREE(inst->popup_data);
inst->popup = NULL; inst->popup_timer = NULL;
inst->popup_data = NULL;
}
static void
_popup_usage_del_cb(void *obj)
{
_popup_usage_del(e_object_data_get(obj));
}
static Eina_Bool
_popup_usage_content_update_cb(void *data)
{
Instance *inst;
_Popup_Data *pd = data;
inst = pd->inst;
if (!battery_config->have_battery)
{
_popup_usage_del(inst);
return ECORE_CALLBACK_CANCEL;
}
if (!inst->popup) return ECORE_CALLBACK_CANCEL;
elm_progressbar_pulse_set(pd->pb, 0);
elm_progressbar_pulse(pd->pb, 0);
if (battery_config->have_power && battery_config->charging)
elm_object_text_set(pd->fr, _("Charging"));
else if (battery_config->have_power)
elm_object_text_set(pd->fr, _("Plugged in"));
else
elm_object_text_set(pd->fr, _("Discharging"));
elm_progressbar_value_set(pd->pb, (double) battery_config->full / 100.0);
return ECORE_CALLBACK_RENEW;
}
static Evas_Object *
_popup_usage_content_add(Evas_Object *parent, Instance *inst)
{
Evas_Object *tbl, *fr, *pb, *o;
_Popup_Data *pd;
tbl = elm_table_add(parent);
E_FILL(tbl); E_EXPAND(tbl);
evas_object_show(tbl);
o = evas_object_rectangle_add(evas_object_evas_get(parent));
evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(160), ELM_SCALE_SIZE(1));
evas_object_size_hint_max_set(o, ELM_SCALE_SIZE(320), ELM_SCALE_SIZE(240));
elm_table_pack(tbl, o, 0, 0, 1, 1);
fr = elm_frame_add(tbl);
E_FILL(fr); E_EXPAND(fr);
evas_object_show(fr);
pb = elm_progressbar_add(tbl);
E_FILL(pb); E_EXPAND(pb);
evas_object_show(pb);
elm_progressbar_span_size_set(pb, 1.0);
elm_object_content_set(fr, pb);
elm_table_pack(tbl, fr, 0, 0, 1, 1);
if (!battery_config->have_battery)
{
elm_progressbar_pulse_set(pb, 1);
elm_progressbar_pulse(pb, 1);
elm_object_text_set(fr, _("Battery not present"));
}
pd = E_NEW(_Popup_Data, 1);
pd->fr = fr;
pd->pb = pb;
pd->inst = inst;
inst->popup_data = pd;
_popup_usage_content_update_cb(pd);
if (battery_config->have_battery)
inst->popup_timer = ecore_timer_add(10.0, _popup_usage_content_update_cb, pd);
return tbl;
}
static void
_popup_usage_new(Instance *inst)
{
inst->popup = e_gadcon_popup_new(inst->gcc, 0);
e_gadcon_popup_content_set(inst->popup, _popup_usage_content_add(e_comp->elm, inst));
e_gadcon_popup_show(inst->popup);
e_object_data_set(E_OBJECT(inst->popup),inst);
E_OBJECT_DEL_SET(inst->popup, _popup_usage_del_cb);
}
static void
_button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
@ -198,7 +314,14 @@ _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
EVAS_BUTTON_NONE, ev->timestamp, NULL);
}
if (ev->button == 1)
_battery_cb_warning_popup_hide(data, e, obj, event_info);
{
_battery_cb_warning_popup_hide(data, e, obj, event_info);
if (!inst->popup)
_popup_usage_new(inst);
else
_popup_usage_del(inst);
}
}
static void
@ -336,7 +459,7 @@ _battery_device_update(void)
if (time_left < 1) time_left = -1;
if (time_full < 1) time_full = -1;
_battery_update(full, time_left, time_full, have_battery, have_power);
_battery_update(full, time_left, time_full, have_battery, have_power, charging);
}
void
@ -523,7 +646,7 @@ _powersave_cb_config_update(void *data EINA_UNUSED, int type EINA_UNUSED, void *
}
static void
_battery_update(int full, int time_left, int time_full, Eina_Bool have_battery, Eina_Bool have_power)
_battery_update(int full, int time_left, int time_full, Eina_Bool have_battery, Eina_Bool have_power, Eina_Bool charging)
{
Eina_List *l;
Instance *inst;
@ -647,6 +770,7 @@ _battery_update(int full, int time_left, int time_full, Eina_Bool have_battery,
battery_config->time_left = time_left;
battery_config->have_battery = have_battery;
battery_config->have_power = have_power;
battery_config->charging = charging;
}
static Eina_Bool
@ -690,11 +814,12 @@ _battery_cb_exe_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
int time_full = 0;
int have_battery = 0;
int have_power = 0;
int charging = 0;
if (sscanf(ev->lines[i].line, "%i %i %i %i %i", &full, &time_left, &time_full,
&have_battery, &have_power) == 5)
_battery_update(full, time_left, time_full,
have_battery, have_power);
have_battery, have_power, charging);
else
e_powersave_mode_set(E_POWERSAVE_MODE_LOW);
}

View File

@ -48,6 +48,7 @@ struct _Config
int time_full;
int have_battery;
int have_power;
Eina_Bool charging;
int desktop_notifications;
#ifdef HAVE_EEZE
Eeze_Udev_Watch *acwatch;