enlightenment/src/modules/policy_mobile/e_mod_softkey.c

172 lines
4.1 KiB
C

#include "e_mod_main.h"
static void _pol_cb_softkey(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED);
static void _pol_softkey_iconify(E_Zone *zone, Eina_Bool all);
static Evas_Object *_pol_softkey_icon_add(E_Zone *zone, const char *name);
static void _pol_softkey_icon_del(Evas_Object *comp_obj);
static void
_pol_cb_softkey(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
{
E_Zone *zone;
Eina_Bool all;
zone = data;
if (!e_util_strcmp(emission, "e,action,softkey,home"))
all = EINA_TRUE;
else if (!e_util_strcmp(emission, "e,action,softkey,back"))
all = EINA_FALSE;
else
return;
_pol_softkey_iconify(zone, all);
}
static void
_pol_softkey_iconify(E_Zone *zone, Eina_Bool all)
{
E_Desk *desk;
E_Client *ec;
Pol_Client *launcher;
desk = e_desk_current_get(zone);
launcher = e_mod_pol_client_launcher_get(zone);
E_CLIENT_REVERSE_FOREACH(e_comp_get(desk), ec)
{
if (e_client_util_ignored_get(ec)) continue;
if (!e_client_util_desk_visible(ec, desk)) continue;
if (!evas_object_visible_get(ec->frame)) continue;
if ((launcher) && (launcher->ec == ec))
return;
e_client_iconify(ec);
if (!all) return;
}
}
static Evas_Object *
_pol_softkey_icon_add(E_Zone *zone, const char *name)
{
Evas_Object *obj, *comp_obj;
char path[PATH_MAX], group[PATH_MAX];
obj = edje_object_add(e_comp_get(NULL)->evas);
snprintf(group, sizeof(group), "e/modules/policy-mobile/softkey/%s", name);
snprintf(path, sizeof(path), "%s/e-module-policy-mobile.edj",
e_module_dir_get(_pol_mod->module));
if (!e_theme_edje_object_set(obj, NULL, group))
edje_object_file_set(obj, path, group);
edje_object_signal_callback_add(obj, "e,action,softkey,*", "e",
_pol_cb_softkey, zone);
/* use TYPE_NONE to disable shadow for softkey object */
comp_obj = e_comp_object_util_add(obj, E_COMP_OBJECT_TYPE_NONE);
evas_object_layer_set(comp_obj, E_LAYER_POPUP);
evas_object_data_set(comp_obj, "policy_mobile_obj", obj);
return comp_obj;
}
static void
_pol_softkey_icon_del(Evas_Object *comp_obj)
{
Evas_Object *obj;
obj = evas_object_data_get(comp_obj, "policy_mobile_obj");
edje_object_signal_callback_del(obj, "e,action,softkey,*",
"e", _pol_cb_softkey);
evas_object_hide(comp_obj);
evas_object_del(comp_obj);
}
Pol_Softkey *
e_mod_pol_softkey_add(E_Zone *zone)
{
Pol_Softkey *softkey;
softkey = E_NEW(Pol_Softkey, 1);
softkey->zone = zone;
softkey->home = _pol_softkey_icon_add(zone, "home");
softkey->back = _pol_softkey_icon_add(zone, "back");
_pol_mod->softkeys = eina_inlist_append(_pol_mod->softkeys, EINA_INLIST_GET(softkey));
return softkey;
}
void
e_mod_pol_softkey_del(Pol_Softkey *softkey)
{
if (!softkey) return;
_pol_softkey_icon_del(softkey->home);
_pol_softkey_icon_del(softkey->back);
_pol_mod->softkeys = eina_inlist_remove(_pol_mod->softkeys, EINA_INLIST_GET(softkey));
free(softkey);
}
void
e_mod_pol_softkey_show(Pol_Softkey *softkey)
{
if (!softkey) return;
e_mod_pol_softkey_update(softkey);
evas_object_show(softkey->home);
evas_object_show(softkey->back);
}
void
e_mod_pol_softkey_hide(Pol_Softkey *softkey)
{
if (!softkey) return;
evas_object_hide(softkey->home);
evas_object_hide(softkey->back);
}
void
e_mod_pol_softkey_update(Pol_Softkey *softkey)
{
int x, y, w, h, ow, oh, space;
if (!softkey) return;
e_zone_useful_geometry_get(softkey->zone, &x, &y, &w, &h);
ow = oh = _pol_mod->conf->softkey_size;
x = x + (w - ow) / 2;
y = h - oh;
space = ow * 4;
evas_object_geometry_set(softkey->home, x - space, y, ow, oh);
evas_object_geometry_set(softkey->back, x + space, y, ow, oh);
}
Pol_Softkey *
e_mod_pol_softkey_get(E_Zone *zone)
{
Pol_Softkey *softkey;
EINA_INLIST_FOREACH(_pol_mod->softkeys, softkey)
{
if (softkey->zone == zone)
return softkey;
}
return NULL;
}