systray - fix sizing of tray so you can see the icons

this should also address the last comment with a fix T5910
This commit is contained in:
Carsten Haitzler 2018-03-12 00:17:11 +09:00 committed by Simon Lees
parent eba3bec170
commit 1296061c19
2 changed files with 88 additions and 71 deletions

View File

@ -90,6 +90,50 @@ _cb_menu_cfg(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
NULL, 0, v, data);
}
#endif
static Eina_Bool
_is_horiz(Instance *inst)
{
switch (inst->gcc->gadcon->orient)
{
case E_GADCON_ORIENT_FLOAT:
case E_GADCON_ORIENT_HORIZ:
case E_GADCON_ORIENT_TOP:
case E_GADCON_ORIENT_BOTTOM:
case E_GADCON_ORIENT_CORNER_TL:
case E_GADCON_ORIENT_CORNER_TR:
case E_GADCON_ORIENT_CORNER_BL:
case E_GADCON_ORIENT_CORNER_BR:
return EINA_TRUE;
break;
case E_GADCON_ORIENT_VERT:
case E_GADCON_ORIENT_LEFT:
case E_GADCON_ORIENT_RIGHT:
case E_GADCON_ORIENT_CORNER_LT:
case E_GADCON_ORIENT_CORNER_RT:
case E_GADCON_ORIENT_CORNER_LB:
case E_GADCON_ORIENT_CORNER_RB:
default:
return EINA_FALSE;
break;
}
return EINA_TRUE;
}
static void
_redo_sizing(Instance *inst)
{
Eina_List *l;
Evas_Object *o;
Evas_Coord w, h;
evas_object_geometry_get(inst->ui.gadget, NULL, NULL, &w, &h);
EINA_LIST_FOREACH(inst->icons, l, o)
{
if (_is_horiz(inst)) evas_object_size_hint_min_set(o, h, 0);
else evas_object_size_hint_min_set(o, 0, w);
}
}
static void
_systray_menu_new(Instance *inst, Evas_Event_Mouse_Down *ev)
{
@ -123,6 +167,14 @@ _systray_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA
_systray_menu_new(inst, ev);
}
static void
_systray_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
Instance *inst = data;
_redo_sizing(inst);
systray_size_updated(inst);
}
static void
_systray_theme(Evas_Object *o, const char *shelf_style, const char *gc_style)
{
@ -181,6 +233,8 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
}
inst->ui.gadget = edje_object_add(inst->evas);
evas_object_event_callback_add(inst->ui.gadget, EVAS_CALLBACK_RESIZE,
_systray_cb_resize, inst);
_systray_theme(inst->ui.gadget, gc->shelf ? gc->shelf->style : NULL, style);
@ -225,6 +279,7 @@ _gc_shutdown(E_Gadcon_Client *gcc)
if (inst->job.size_apply)
ecore_job_del(inst->job.size_apply);
inst->icons = eina_list_free(inst->icons);
E_FREE(inst);
gcc->data = NULL;
}
@ -306,6 +361,8 @@ _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient)
edje_object_signal_emit(inst->ui.gadget, sig, _sig_source);
edje_object_message_signal_process(inst->ui.gadget);
_redo_sizing(inst);
systray_size_updated(inst);
}
static const char *
@ -395,13 +452,6 @@ e_modapi_save(E_Module *m EINA_UNUSED)
return 1;
}
E_Gadcon_Orient
systray_orient_get(const Instance *inst)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(inst, E_GADCON_ORIENT_HORIZ);
return inst->gcc->gadcon->orient;
}
const E_Gadcon *
systray_gadcon_get(const Instance *inst)
{
@ -409,32 +459,6 @@ systray_gadcon_get(const Instance *inst)
return inst->gcc->gadcon;
}
E_Gadcon_Client *
systray_gadcon_client_get(const Instance *inst)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(inst, NULL);
return inst->gcc;
}
const char *
systray_style_get(const Instance *inst)
{
const char *style;
EINA_SAFETY_ON_NULL_RETURN_VAL(inst, NULL);
style = inst->gcc->style;
if (!style)
style = "default";
return style;
}
Evas *
systray_evas_get(const Instance *inst)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(inst, NULL);
return inst->evas;
}
Evas_Object *
systray_edje_get(const Instance *inst)
{
@ -442,38 +466,39 @@ systray_edje_get(const Instance *inst)
return inst->ui.gadget;
}
const Evas_Object *
systray_box_get(const Instance *inst)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(inst, NULL);
return edje_object_part_object_get(inst->ui.gadget, "box");
}
void
systray_edje_box_append(const Instance *inst, Evas_Object *child)
systray_edje_box_append(Instance *inst, Evas_Object *child)
{
Evas_Coord w, h;
inst->icons = eina_list_append(inst->icons, child);
evas_object_size_hint_aspect_set(child, EVAS_ASPECT_CONTROL_BOTH, 1.0, 1.0);
evas_object_geometry_get(inst->ui.gadget, NULL, NULL, &w, &h);
if (_is_horiz(inst)) evas_object_size_hint_min_set(child, h, 0);
else evas_object_size_hint_min_set(child, 0, w);
edje_object_part_box_append(inst->ui.gadget, "box", child);
}
void
systray_edje_box_prepend(const Instance *inst, Evas_Object *child)
systray_edje_box_prepend(Instance *inst, Evas_Object *child)
{
Evas_Coord w, h;
inst->icons = eina_list_prepend(inst->icons, child);
evas_object_size_hint_aspect_set(child, EVAS_ASPECT_CONTROL_BOTH, 1.0, 1.0);
evas_object_geometry_get(inst->ui.gadget, NULL, NULL, &w, &h);
if (_is_horiz(inst)) evas_object_size_hint_min_set(child, h, 0);
else evas_object_size_hint_min_set(child, 0, w);
edje_object_part_box_prepend(inst->ui.gadget, "box", child);
}
void
systray_edje_box_remove(const Instance *inst, Evas_Object *child)
systray_edje_box_remove(Instance *inst, Evas_Object *child)
{
inst->icons = eina_list_remove(inst->icons, child);
edje_object_part_box_remove(inst->ui.gadget, "box", child);
}
Ecore_X_Window
systray_root_get(const Instance *inst)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(inst, 0);
return e_comp->root;
}
static void
_systray_size_apply_do(Instance *inst)
{

View File

@ -29,43 +29,35 @@ struct _Systray_Context
struct _Instance
{
E_Gadcon_Client *gcc;
Evas *evas;
E_Gadcon_Client *gcc;
Evas *evas;
Instance_Notifier_Host *notifier;
struct
{
Evas_Object *gadget;
Eina_List *icons;
struct {
Evas_Object *gadget;
} ui;
struct
{
Ecore_Job *size_apply;
struct {
Ecore_Job *size_apply;
} job;
};
typedef struct Notifier_Item_Cache
{
Eina_Stringshare *path;
Eina_Stringshare *path;
} Notifier_Item_Cache;
struct Systray_Config
{
Eina_Stringshare *dbus;
Eina_Hash *items;
Eina_Stringshare *dbus;
Eina_Hash *items;
};
E_Gadcon_Orient systray_orient_get(const Instance *inst);
const E_Gadcon *systray_gadcon_get(const Instance *inst);
E_Gadcon_Client *systray_gadcon_client_get(const Instance *inst);
const char *systray_style_get(const Instance *inst);
void systray_size_updated(Instance *inst);
Evas *systray_evas_get(const Instance *inst);
Evas_Object *systray_edje_get(const Instance *inst);
const Evas_Object *systray_box_get(const Instance *inst);
void systray_edje_box_append(const Instance *inst, Evas_Object *child);
void systray_edje_box_remove(const Instance *inst, Evas_Object *child);
void systray_edje_box_prepend(const Instance *inst, Evas_Object *child);
Ecore_X_Window systray_root_get(const Instance *inst);
void systray_edje_box_append(Instance *inst, Evas_Object *child);
void systray_edje_box_remove(Instance *inst, Evas_Object *child);
void systray_edje_box_prepend(Instance *inst, Evas_Object *child);
Instance_Notifier_Host *systray_notifier_host_new(Instance *inst, E_Gadcon *gadcon);
void systray_notifier_host_free(Instance_Notifier_Host *notifier);