procstats: fix popup state on maximize/unmaximize

This commit is contained in:
Alastair Poole 2022-03-08 10:51:21 +00:00
parent 9e23feb482
commit 0fc17828f6
1 changed files with 91 additions and 44 deletions

View File

@ -32,6 +32,7 @@ typedef struct
uint64_t mem_size;
uint64_t cpu_time;
uint64_t cpu_time_prev;
Eina_Bool was_maximized;
} Proc_Stats_Client;
static void _proc_stats_client_add(E_Client *ec);
@ -42,6 +43,8 @@ static void _proc_stats_client_del(Proc_Stats_Client *client);
static Eina_Bool _proc_stats_client_gone(Proc_Stats_Client *client);
static void _proc_stats_client_children_update(Eina_List *children, Proc_Stats_Client *client);
static void _proc_stats_client_update(Eina_List *procs, Proc_Stats_Client *client);
static void _proc_stats_client_popup_add(Proc_Stats_Client *client);
static void _proc_stats_client_popup_del(Proc_Stats_Client *client);
static Eina_Bool
_memory_total(void)
@ -91,8 +94,7 @@ _proc_stats_client_exists(E_Client *ec)
static void
_proc_stats_client_del(Proc_Stats_Client *client)
{
if (client->popup) evas_object_del(client->popup);
client->popup = NULL;
_proc_stats_client_popup_del(client);
edje_object_signal_emit(client->frame_obj, "e,state,procstats,off", "e");
evas_object_del(client->obj);
e_object_delfn_del(E_OBJECT(client->ec), client->delfn);
@ -110,47 +112,11 @@ _proc_stats_client_del_cb(void *data, void *obj EINA_UNUSED)
}
static void
_proc_stats_client_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
_proc_stats_client_popup_add(Proc_Stats_Client *client)
{
Proc_Stats_Client *client;
Evas_Coord ox, oy, ow, oh;
client = data;
if ((!client) || (!client->popup)) return;
evas_object_geometry_get(client->obj, &ox, &oy, &ow, &oh);
evas_object_move(client->popup, ox + (ow / 2), oy);
if ((client->ec->hidden) || (client->ec->iconic))
evas_object_hide(client->popup);
else
evas_object_show(client->popup);
}
static void
_proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Up *ev;
Proc_Stats_Client *client;
Evas_Object *o, *tb;
Evas_Object *pb;
Evas_Coord ox, oy, ow, oh;
ev = event_info;
client = data;
if (ev->button != 1) return;
if (!client) return;
if (client->popup)
{
evas_object_del(client->popup);
client->popup = NULL;
return;
}
evas_object_geometry_get(client->obj, &ox, &oy, &ow, &oh);
client->popup = o = elm_ctxpopup_add(e_comp->elm);
@ -179,14 +145,94 @@ _proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
_proc_stats_client_display_update(client);
elm_ctxpopup_direction_priority_set(o, ELM_CTXPOPUP_DIRECTION_UP,
ELM_CTXPOPUP_DIRECTION_DOWN,
ELM_CTXPOPUP_DIRECTION_LEFT,
ELM_CTXPOPUP_DIRECTION_RIGHT);
evas_object_move(o, ox + (ow / 2), oy);
if (client->ec->maximized)
{
elm_ctxpopup_direction_priority_set(o, ELM_CTXPOPUP_DIRECTION_DOWN,
ELM_CTXPOPUP_DIRECTION_UP,
ELM_CTXPOPUP_DIRECTION_LEFT,
ELM_CTXPOPUP_DIRECTION_RIGHT);
evas_object_move(o, ox + (ow / 2), oy + ow);
}
else
{
elm_ctxpopup_direction_priority_set(o, ELM_CTXPOPUP_DIRECTION_UP,
ELM_CTXPOPUP_DIRECTION_DOWN,
ELM_CTXPOPUP_DIRECTION_LEFT,
ELM_CTXPOPUP_DIRECTION_RIGHT);
evas_object_move(o, ox + (ow / 2), oy);
}
evas_object_show(o);
}
static void
_proc_stats_client_popup_del(Proc_Stats_Client *client)
{
if (!client) return;
if (client->popup)
evas_object_del(client->popup);
client->popup = NULL;
}
static void
_proc_stats_client_resize_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Proc_Stats_Client *client;
client = data;
if ((!client) || (!client->popup)) return;
if (client->was_maximized != client->ec->maximized)
{
_proc_stats_client_popup_del(client);
_proc_stats_client_popup_add(client);
}
client->was_maximized = client->ec->maximized;
}
static void
_proc_stats_client_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Proc_Stats_Client *client;
Evas_Coord ox, oy, ow, oh;
client = data;
if ((!client) || (!client->popup)) return;
evas_object_geometry_get(client->obj, &ox, &oy, &ow, &oh);
evas_object_move(client->popup, ox + (ow / 2), oy);
if ((client->ec->hidden) || (client->ec->iconic))
evas_object_hide(client->popup);
else
evas_object_show(client->popup);
}
static void
_proc_stats_icon_clicked_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Up *ev;
Proc_Stats_Client *client;
ev = event_info;
client = data;
if (ev->button != 1) return;
if (!client) return;
if (client->popup)
{
_proc_stats_client_popup_del(client);
return;
}
_proc_stats_client_popup_add(client);
}
static void
_proc_stats_client_add(E_Client *ec)
{
@ -229,6 +275,7 @@ _proc_stats_client_add(E_Client *ec)
client->delfn = e_object_delfn_add(E_OBJECT(ec), _proc_stats_client_del_cb, client);
evas_object_event_callback_add(client->obj, EVAS_CALLBACK_MOVE, _proc_stats_client_move_cb, client);
evas_object_event_callback_add(client->obj, EVAS_CALLBACK_MOUSE_UP, _proc_stats_icon_clicked_cb, client);
evas_object_event_callback_add(client->frame_obj, EVAS_CALLBACK_RESIZE, _proc_stats_client_resize_cb, client);
module->clients = eina_list_append(module->clients, client);
}