enlightenment/src/bin/e_iconify.c

85 lines
2.0 KiB
C

#include "e.h"
typedef struct _E_Iconify_Provider E_Iconify_Provider;
struct _E_Iconify_Provider
{
E_Iconify_Provider_Cb func;
const void *data;
int pri;
};
static Eina_List *_e_iconify_providers = NULL;
static E_Iconify_Provider *
_e_iconify_provider_get(void)
{
Eina_List *l;
E_Iconify_Provider *prov, *prov_found = NULL;
int pri_found = -9999;
EINA_LIST_FOREACH(_e_iconify_providers, l, prov)
{
if (prov->pri >= pri_found) prov_found = prov;
}
return prov_found;
}
EAPI void
e_iconify_provider_add(int pri, E_Iconify_Provider_Cb provider, const void *data)
{
E_Iconify_Provider *prov;
prov = E_NEW(E_Iconify_Provider, 1);
if (!prov) return;
_e_iconify_providers = eina_list_append(_e_iconify_providers, prov);
prov->func = provider;
prov->data = data;
prov->pri = pri;
}
EAPI void
e_iconify_provider_del(int pri, E_Iconify_Provider_Cb provider, const void *data)
{
Eina_List *l;
E_Iconify_Provider *prov;
EINA_LIST_FOREACH(_e_iconify_providers, l, prov)
{
if ((prov->func == provider) &&
(prov->data == data) &&
(prov->pri == pri))
{
_e_iconify_providers =
eina_list_remove_list(_e_iconify_providers, l);
free(prov);
return;
}
}
}
EAPI void
e_iconify_provider_obj_message(E_Client *ec, Eina_Bool iconify, Evas_Object *edje_target)
{
E_Iconify_Provider *prov;
Evas_Coord ox, oy, ow, oh;
Edje_Message_Int_Set *msg;
int x, y, w, h;
prov = _e_iconify_provider_get();
if (!prov) return;
evas_object_geometry_get(edje_target, &ox, &oy, &ow, &oh);
x = ox + (ow / 2);
y = oy + (oh / 2);
w = 1;
h = 1;
prov->func((void *)(prov->data), ec, iconify, &x, &y, &w, &h);
msg = alloca(sizeof(Edje_Message_Int_Set) + ((4 - 1) * sizeof(int)));
msg->count = 4;
msg->val[0] = x - ox;
msg->val[1] = y - oy;
msg->val[2] = w;
msg->val[3] = h;
edje_object_message_send(edje_target, EDJE_MESSAGE_INT_SET, 10, msg);
}