forked from enlightenment/enlightenment
172 lines
4.1 KiB
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(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->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;
|
|
}
|