discomfitor pushed a commit to branch enlightenment-0.21.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=4c4016ad0208b2f625167877523cfe7bf52d1391

commit 4c4016ad0208b2f625167877523cfe7bf52d1391
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Fri Sep 1 13:40:12 2017 -0400

    track gadget ctxpopups and reposition within zone on resize
    
    this attempts to shift the ctxpopup content vertically and horizontally to
    keep it on the same screen that the gadget is on
    
    fix T5945
---
 src/bin/e_gadget.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/bin/e_gadget.c b/src/bin/e_gadget.c
index 8923a6942..4d7c45386 100644
--- a/src/bin/e_gadget.c
+++ b/src/bin/e_gadget.c
@@ -1581,18 +1581,51 @@ _gadget_util_ctxpopup_visibility(void *data 
EINA_UNUSED, Evas *e EINA_UNUSED, Ev
 }
 
 static void
-_gadget_util_ctxpopup_moveresize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_gadget_util_ctxpopup_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    e_comp_shape_queue();
 }
 
+static void
+_gadget_util_ctxpopup_resize(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj, void *event_info EINA_UNUSED)
+{
+   int x, y, w, h;
+   int zx, zy, zw, zh;
+
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+   e_zone_useful_geometry_get(e_comp_object_util_zone_get(obj), &zx, &zy, &zw, 
&zh);
+   if (!E_CONTAINS(zx, zy, zw, zh, x, y, w, h))
+     {
+        evas_object_hide(obj);
+        if (!E_CONTAINS(zx, zy, zw, zh, x, y, 1, h))
+          {
+             if (!E_CONTAINS(zx, zy, zw, zh, x, y, 1, 1))
+               evas_object_move(data, x, zy + (h / 2) + 10);
+             else
+               evas_object_move(data, x, zy + zh - (h / 2) - 10);
+          }
+        else
+          {
+             if (!E_CONTAINS(zx, zy, zw, zh, x, y, 1, 1))
+               evas_object_move(data, zx + (w / 2) + 10, y);
+             else
+               evas_object_move(data, zx + zw - (w / 2) - 10, y);
+          }
+        evas_object_show(obj);
+     }
+   e_comp_shape_queue();
+}
+
 E_API void
 e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object *ctx, Evas_Object 
*pos_obj)
 {
    int x, y, w, h;
+   int zx, zy, zw, zh;
+   int pw = 1, ph = 1;
    E_Layer layer;
    E_Gadget_Config *zgc;
    Evas_Object *content;
+   E_Zone *zone;
    Elm_Ctxpopup_Direction first, second;
 
    EINA_SAFETY_ON_NULL_RETURN(g);
@@ -1604,7 +1637,11 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object 
*ctx, Evas_Object *pos_
    layer = MAX(evas_object_layer_get(pos_obj ?: g), E_LAYER_POPUP);
    evas_object_layer_set(ctx, layer);
 
+   if (content) evas_object_geometry_get(content, NULL, NULL, &pw, &ph);
+
    evas_object_geometry_get(pos_obj ?: g, &x, &y, &w, &h);
+   zone = e_comp_object_util_zone_get(pos_obj ?: g);
+   e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
    if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
      y += h;
    if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
@@ -1612,6 +1649,7 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object 
*ctx, Evas_Object *pos_
    if (zgc->site->orient == E_GADGET_SITE_ORIENT_HORIZONTAL)
      {
         x += w / 2;
+        x = E_CLAMP(x, zx, zx + zw - MAX(pw, w));
         first = ELM_CTXPOPUP_DIRECTION_UP, second = 
ELM_CTXPOPUP_DIRECTION_DOWN;
         if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_TOP)
           first = ELM_CTXPOPUP_DIRECTION_DOWN, second = 
ELM_CTXPOPUP_DIRECTION_UP;
@@ -1619,14 +1657,13 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, 
Evas_Object *ctx, Evas_Object *pos_
    else if (zgc->site->orient == E_GADGET_SITE_ORIENT_VERTICAL)
      {
         y += h / 2;
+        y = E_CLAMP(y, zy, zy + zh - MAX(ph, h));
         first = ELM_CTXPOPUP_DIRECTION_LEFT, second = 
ELM_CTXPOPUP_DIRECTION_RIGHT;
         if (zgc->site->anchor & E_GADGET_SITE_ANCHOR_LEFT)
           first = ELM_CTXPOPUP_DIRECTION_RIGHT, second = 
ELM_CTXPOPUP_DIRECTION_LEFT;
      }
    else
      {
-        int zx, zy, zw, zh;
-        e_zone_useful_geometry_get(e_comp_object_util_zone_get(pos_obj ?: g), 
&zx, &zy, &zw, &zh);
         if (x < zx + (zw / 2))
           {
              second = ELM_CTXPOPUP_DIRECTION_RIGHT;
@@ -1648,8 +1685,8 @@ e_gadget_util_ctxpopup_place(Evas_Object *g, Evas_Object 
*ctx, Evas_Object *pos_
    evas_object_event_callback_add(ctx, EVAS_CALLBACK_HIDE, 
_gadget_util_ctxpopup_visibility, NULL);
    if (content)
      {
-        evas_object_event_callback_add(content, EVAS_CALLBACK_MOVE, 
_gadget_util_ctxpopup_moveresize, NULL);
-        evas_object_event_callback_add(content, EVAS_CALLBACK_RESIZE, 
_gadget_util_ctxpopup_moveresize, NULL);
+        evas_object_event_callback_add(content, EVAS_CALLBACK_MOVE, 
_gadget_util_ctxpopup_move, NULL);
+        evas_object_event_callback_add(content, EVAS_CALLBACK_RESIZE, 
_gadget_util_ctxpopup_resize, ctx);
      }
    evas_object_smart_callback_call(zgc->site->layout, "gadget_site_popup", 
ctx);
    if (evas_object_visible_get(ctx))

-- 


Reply via email to