widget/entry: Update show region geometry when entry is resized
authorYoungbok Shin <youngb.shin@samsung.com>
Thu, 22 Dec 2016 04:41:14 +0000 (13:41 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Mon, 2 Jan 2017 05:37:12 +0000 (14:37 +0900)
It fixes the following problems.

 - elm_widget_show_region_set() could be called from
   inside of elm_widget_show_region_set(). And the last function call
   could be ignored and given values were abandoned.
   The patch updates show region values everytime.

 - When elm_entry is resized during processing elm_widget_show_region_set(),
   it must update its show region geometry to show proper region according to
   lastest geometry.
   The patch will show proper region of elm_entry's cursor.

@tizen_fix

Change-Id: Ia92a5232cfd26aa98075cdb9e4b54d376d1c44b7

src/lib/elm_entry.c
src/lib/elm_widget.c
src/lib/elm_widget.h

index fd0f303..0d6ea8b 100644 (file)
@@ -4726,6 +4726,21 @@ _elm_entry_resize_internal(Evas_Object *obj)
      }
 
    if (sd->hoversel) _hoversel_position(obj);
+
+   /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized */
+   /* Update show region geometry if current resize event is
+      occured during processing elm_widget_show_region_set() function. */
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+   if (wd->on_show_region_set)
+     {
+        Evas_Coord cx, cy, cw, ch;
+
+        edje_object_part_text_cursor_geometry_get
+          (sd->entry_edje, "elm.text", &cx, &cy, &cw, &ch);
+        elm_widget_show_region_set(obj, cx, cy, cw, ch, EINA_FALSE);
+     }
+   /* END */
 }
 
 static void
index 14219f2..2559da6 100644 (file)
@@ -3228,7 +3228,10 @@ _elm_widget_show_region_set(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Coord x, Ev
    Evas_Coord px, py, cx, cy, nx = 0, ny = 0;
 
 
+   /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized
+      Move this code to the blow to update show region geometry properly.
    evas_smart_objects_calculate(evas_object_evas_get(obj));
+    */
 
    if (!forceshow && (x == sd->rx) && (y == sd->ry) &&
        (w == sd->rw) && (h == sd->rh)) return;
@@ -3237,6 +3240,25 @@ _elm_widget_show_region_set(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Coord x, Ev
    sd->ry = y;
    sd->rw = w;
    sd->rh = h;
+
+   /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized */
+   /* Block nested call for evas_smart_objects_calculate() and region showing works */
+   if (sd->on_show_region_set) return;
+
+   sd->on_show_region_set = EINA_TRUE;
+
+   evas_smart_objects_calculate(evas_object_evas_get(obj));
+
+   sd->on_show_region_set = EINA_FALSE;
+
+   /* show_region geometry could be changed during processing elm_widget_show_region_set().
+      evas_smart_objects_calculate() can trigger nested show_region_set calls */
+   x = sd->rx;
+   y = sd->ry;
+   w = sd->rw;
+   h = sd->rh;
+   /* END */
+
    if (sd->on_show_region)
      {
         sd->on_show_region
index a9b4a04..cf0a32c 100644 (file)
@@ -478,6 +478,10 @@ typedef struct _Elm_Widget_Smart_Data
    Eina_Bool                     scroll_item_align_enable;
    const char                    *scroll_item_valign;
 //
+
+   /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized */
+   Eina_Bool                     on_show_region_set: 1;
+   /* END */
 } Elm_Widget_Smart_Data;
 
 /**