Autoscroll using conformant: By default it is enabled. To disable autoscroll changes...
authorJoseph T <joseph.t@samsung.com>
Wed, 22 Sep 2010 22:00:05 +0000 (18:00 -0400)
committerJoseph T <joseph.t@samsung.com>
Wed, 22 Sep 2010 22:00:05 +0000 (18:00 -0400)
configure.ac
src/lib/elc_scrolled_entry.c
src/lib/elm_conform.c
src/lib/elm_editfield.c
src/lib/elm_entry.c
src/lib/elm_priv.h
src/lib/elm_widget.c

index c7d40e8..4bcf7e8 100755 (executable)
@@ -205,6 +205,28 @@ if test "x$want_elementary_x" = "xyes" -a "x$have_elementary_x" = "xno"; then
     AC_MSG_ERROR([ecore-x support requested, but not found by pkg-config.])
 fi
 
+have_conformant_autoscroll="no"
+want_conformant_autoscroll="yes"
+AC_ARG_ENABLE([ecore-x],
+   [AC_HELP_STRING([--disable-ecore-x], [disable ecore-x support. @<:@default=detect@:>@])],
+   [want_conformant_autoscroll=$enableval], [])
+
+if test "x$want_conformant_autoscroll" != "xno"; then
+   PKG_CHECK_MODULES([ELEMENTARY_X],
+      [ecore-x >= 1.0.0],
+      [
+       AC_DEFINE(HAVE_CONFORMANT_AUTOSCROLL, 1, [autoscroll with conformant])
+       have_conformant_autoscroll="yes"
+       requirement_elm="ecore-x >= 1.0.0 ${requirement_elm}"
+      ],
+      [have_conformant_autoscroll="no"]
+   )
+else
+    have_conformant_autoscroll="no"
+fi
+if test "x$want_conformant_autoscroll" = "xyes" -a "x$have_conformant_autoscroll" = "xno"; then
+    AC_MSG_ERROR([ecore-x support requested, but not found by pkg-config.])
+fi
 
 have_elementary_fb="no"
 want_elementary_fb="auto"
index cfc254a..1ec644b 100644 (file)
@@ -128,6 +128,17 @@ _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
      elm_widget_focus_steal(wd->entry);
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static Evas_Object *
+_imp_region_get_hook(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   elm_widget_imp_region_get(wd->entry, x, y, w, h);
+   return wd->scroller;
+}
+#endif
+
 static void
 _disable_hook(Evas_Object *obj)
 {
@@ -278,6 +289,9 @@ elm_scrolled_entry_add(Evas_Object *parent)
    elm_widget_can_focus_set(obj, 1);
    elm_widget_theme_hook_set(obj, _theme_hook);
    elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   elm_widget_imp_region_get_hook_set(obj, _imp_region_get_hook, NULL);
+#endif
 
    wd->scroller = elm_scroller_add(parent);
    elm_widget_resize_object_set(obj, wd->scroller);
index e7d978c..d4d8a24 100644 (file)
@@ -16,6 +16,14 @@ struct _Widget_Data
    Evas_Object *base;
    Evas_Object *shelf, *panel;
    Evas_Object *content;
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   Evas_Object *virtualkeypad;
+   Evas_Object *focus_obj;
+   Evas_Object *scroller;
+   Evas_Coord frelx, frely;
+   int vkeypad_height;
+   Ecore_X_Virtual_Keyboard_State vkeypad_state;
+#endif
    Ecore_Event_Handler *prop_hdl;
    struct {
       Ecore_Animator *animator; // animaton timer
@@ -31,6 +39,9 @@ static void _del_hook(Evas_Object *obj);
 static void _theme_hook(Evas_Object *obj);
 static void _sizing_eval(Evas_Object *obj);
 static Eina_Bool _prop_change(void *data, int type, void *event);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static const char SIG_IMPREGION_CHANGED[] = "impregion,changed";
+#endif
 
 /* local functions */
 static void 
@@ -88,6 +99,144 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
      }
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static Evas_Object *
+_focus_object_get(const Evas_Object *obj)
+{
+   Evas_Object *parent = NULL, *foc = NULL;
+   const char * type = NULL;
+   parent = elm_widget_top_get(obj);
+   if (!parent) return NULL;
+   foc = elm_widget_focused_object_get(parent);
+   return foc;
+}
+
+static void 
+_imp_region_show(void *data, Evas_Object *obj)
+{
+   Evas_Coord x = 0, y = 0, w = 0, h = 0;
+   Evas_Object * immed_scroll = NULL;
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;   
+   if (!wd->scroller) return;
+   if (!wd->focus_obj) return;
+   immed_scroll = elm_widget_imp_region_get(wd->focus_obj, &x, &y, &w, &h);
+   if(x < 0) x = 0;
+   if(y < 0) y = 0;
+   x = x + wd->frelx;
+   y = y + wd->frely;
+   //if(wd->vkeypad_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ON)
+   elm_scroller_region_show(wd->scroller, x, y, w, h);
+}
+
+static void
+_imp_region_changed_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   _imp_region_show(data, obj);
+}
+
+static void 
+_scroller_resize_event_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{ 
+   _imp_region_show(data, obj);
+}
+
+static bool
+_focus_object_region_calc(void *data, int *kh, bool reg_scrol_resz_evnt)
+{
+   Evas_Coord fx = 0, fy = 0, fw = 0, fh = 0;
+   Evas_Coord sx = 0, sy = 0, sw = 0, sh = 0;
+   Evas_Coord tsx = 0, tsy = 0, tsw = 0, tsh = 0;
+
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return EINA_FALSE;
+   if (!wd->scroller) return EINA_FALSE;
+   if (!wd->focus_obj) return EINA_FALSE;
+   evas_object_geometry_get(wd->focus_obj, &fx, &fy, &fw, &fh);
+   evas_object_geometry_get(wd->scroller, &sx, &sy, &sw, &sh); 
+   elm_scroller_region_get(wd->scroller, &tsx, &tsy, &tsw, &tsh);
+   if(sy > 0)
+    {
+      fy = fy - sy;
+    }
+   wd->frelx = tsx + fx;
+   wd->frely = tsy + fy;
+}
+
+static bool
+_get_scroller(void *data, Evas_Object * foc_obj, bool reg_scrol_resz_evnt)
+{
+   Evas_Coord x = 0, y = 0, w = 0, h = 0;
+   Evas_Object * parent = NULL;
+   Evas_Object * immed_scroll=NULL;
+   Evas_Object * root_scroller = NULL;
+   Evas_Object *win=NULL;
+   const char * type=NULL;
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return EINA_FALSE;
+   win = elm_widget_top_get(foc_obj);
+   if (!win) return EINA_FALSE;
+   immed_scroll = elm_widget_imp_region_get(foc_obj, &x, &y, &w, &h);
+   parent = elm_object_parent_widget_get( foc_obj );  
+   do
+    {
+      type=elm_widget_type_get(parent);
+      if(!strcmp(type,"scroller"))
+        {
+          root_scroller = parent;
+          break;
+        }
+      parent = elm_object_parent_widget_get( parent );
+    }while(parent && (parent !=win));
+   if(root_scroller)
+     wd->scroller = root_scroller;
+   else if(immed_scroll)
+     wd->scroller = immed_scroll;
+   else
+    {
+      wd->scroller = NULL;
+      return EINA_FALSE;
+    }
+   return EINA_TRUE;
+}
+
+static void
+_autoscroll_mode_enable(void *data)
+{
+   Evas_Object * focused_object=NULL;
+   bool ret = EINA_FALSE;
+   const char * type=NULL;
+   
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return EINA_FALSE;
+   focused_object=_focus_object_get(data);
+   if(focused_object)
+    {
+      wd->focus_obj = focused_object;
+      ret = _get_scroller(data, focused_object, EINA_TRUE);
+    }
+   if(ret == EINA_TRUE)
+    {
+      ret = _focus_object_region_calc(data, NULL, EINA_TRUE);
+      evas_object_event_callback_add(wd->scroller, EVAS_CALLBACK_RESIZE, 
+                                     _scroller_resize_event_cb, data);
+      evas_object_smart_callback_add(wd->focus_obj, SIG_IMPREGION_CHANGED,
+                                      _imp_region_changed_cb, data);
+   }
+}
+
+static void
+_autoscroll_mode_disable(void *data)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return EINA_FALSE;
+   evas_object_event_callback_del(wd->scroller, EVAS_CALLBACK_RESIZE, _scroller_resize_event_cb);
+   evas_object_smart_callback_del(wd->focus_obj, SIG_IMPREGION_CHANGED, _imp_region_changed_cb);
+   wd->scroller = NULL;
+   wd->focus_obj = NULL;
+}
+#endif
+
 /* unused now - but meant to be for making sure the focused widget is always
  * visible when the vkbd comes and goes by moving the conformant obj (and thus
  * its children) to  show the focused widget (and if focus changes follow)
@@ -144,6 +293,12 @@ static Eina_Bool
 _prop_change(void *data, int type __UNUSED__, void *event) 
 {
 #ifdef HAVE_ELEMENTARY_X
+   printf("\n in prop_change \n");
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   int indicator_height=57;
+   Ecore_X_Virtual_Keyboard_State virt_keypad_state = ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
+   printf("\n conformant autoscroll enabled \n");
+#endif
    Ecore_X_Event_Window_Property *ev;
    Widget_Data *wd = elm_widget_data_get(data);
    if (!wd) return ECORE_CALLBACK_PASS_ON;
@@ -155,9 +310,21 @@ _prop_change(void *data, int type __UNUSED__, void *event)
 
         zone = ecore_x_e_illume_zone_get(ev->win);
         ecore_x_e_illume_indicator_geometry_get(zone, NULL, NULL, NULL, &sh);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+        if (sh < 0) sh = indicator_height;
+#else
         if (sh < 0) sh = 0;
+#endif
         evas_object_size_hint_min_set(wd->shelf, -1, sh);
         evas_object_size_hint_max_set(wd->shelf, -1, sh);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+        sh = -1;
+        zone = ecore_x_e_illume_zone_get(ev->win);
+        ecore_x_e_illume_keyboard_geometry_get(zone, NULL, NULL, NULL, &sh);
+        if (sh < 0) sh = 0;
+        evas_object_size_hint_min_set(wd->virtualkeypad, -1, sh);
+        evas_object_size_hint_max_set(wd->virtualkeypad, -1, sh);
+#endif
         sh = -1;
         ecore_x_e_illume_softkey_geometry_get(zone, NULL, NULL, NULL, &sh);
         if (sh < 0) sh = 0;
@@ -186,17 +353,40 @@ _prop_change(void *data, int type __UNUSED__, void *event)
         evas_object_size_hint_min_set(wd->panel, -1, sh);
         evas_object_size_hint_max_set(wd->panel, -1, sh);
      }
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
    else if (ev->atom == ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY) 
      {
         Ecore_X_Window zone;
-        int ky = -1;
+        int ky = -1, kh = -1;
 
         printf("Keyboard Geometry Changed\n");
         zone = ecore_x_e_illume_zone_get(ev->win);
-        ecore_x_e_illume_keyboard_geometry_get(zone, NULL, &ky, NULL, NULL);
+        ecore_x_e_illume_keyboard_geometry_get(zone, NULL, &ky, NULL, &kh);
         printf("\tGeom: %d\n", ky);
+        if (kh < 0) kh = 0;
+        if (kh == wd->vkeypad_height) return ECORE_CALLBACK_PASS_ON;
+        wd->vkeypad_height = kh;
+        evas_object_size_hint_min_set(wd->virtualkeypad, -1, kh);
+        evas_object_size_hint_max_set(wd->virtualkeypad, -1, kh);
+     }
+   else if (ev->atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE)
+     {
+        Ecore_X_Window zone;
+        zone = ecore_x_e_illume_zone_get(ev->win);
+        virt_keypad_state = ecore_x_e_virtual_keyboard_state_get(zone);
+        if (virt_keypad_state == wd->vkeypad_state)   return ECORE_CALLBACK_PASS_ON;
+        wd->vkeypad_state = virt_keypad_state;
+        if(wd->vkeypad_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_ON)
+         {
+           _autoscroll_mode_enable(data);
+         }
+        else if(wd->vkeypad_state == ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF)
+         {
+           _autoscroll_mode_disable(data);
+     }
      }
 #endif
+#endif
 
    return ECORE_CALLBACK_PASS_ON;
 }
@@ -247,6 +437,20 @@ elm_conformant_add(Evas_Object *parent)
    evas_object_size_hint_max_set(wd->shelf, -1, sh);
    edje_object_part_swallow(wd->base, "elm.swallow.shelf", wd->shelf);
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   wd->scroller = NULL;
+   wd->focus_obj = NULL;
+   sh = -1;
+   ecore_x_e_illume_keyboard_geometry_get(zone, NULL, NULL, NULL, &sh);
+   if (sh < 0) sh = 0;
+   wd->virtualkeypad= evas_object_rectangle_add(evas);
+   evas_object_color_set(wd->virtualkeypad, 0, 0, 0, 0);
+   evas_object_size_hint_min_set(wd->virtualkeypad, -1, sh);
+   evas_object_size_hint_max_set(wd->virtualkeypad, -1, sh);
+   edje_object_part_swallow(wd->base, "elm.swallow.virtualkeypad", wd->virtualkeypad);
+   wd->vkeypad_state = ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
+#endif
+
    sh = -1;
    ecore_x_e_illume_softkey_geometry_get(zone, NULL, NULL, NULL, &sh);
    if (sh < 0) sh = 0;
index 83baf6f..b762daf 100644 (file)
@@ -36,6 +36,11 @@ static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *eve
 static void _on_focus_hook(void *data, Evas_Object *obj);
 static Eina_Bool _empty_entry(Evas_Object *entry);
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static const char SIG_CURSOR_CHANGED[] = "cursor,changed";
+static const char SIG_IMPREGION_CHANGED[] = "impregion,changed";
+#endif
+
 static void
 _del_hook(Evas_Object *obj)
 {
@@ -45,6 +50,17 @@ _del_hook(Evas_Object *obj)
    free(wd);
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static Evas_Object *
+_imp_region_get_hook(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   elm_widget_imp_region_get(wd->entry, x, y, w, h);
+   return NULL;
+}
+#endif
+
 static void
 _on_focus_hook(void *data, Evas_Object *obj)
 {
@@ -183,6 +199,16 @@ _entry_changed_cb(void *data, Evas_Object *obj, void* event_info)
      }
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static void
+_entry_cursor_changed_cb(void *data, Evas_Object *obj, void* event_info)
+{
+   Evas_Object *ef_obj = (Evas_Object *)data;
+   Widget_Data *wd = elm_widget_data_get(ef_obj);
+   evas_object_smart_callback_call(ef_obj, SIG_IMPREGION_CHANGED, NULL);
+}
+#endif
+
 static void
 _signal_mouse_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
@@ -260,6 +286,9 @@ elm_editfield_add(Evas_Object *parent)
    elm_widget_changed_hook_set(obj, _changed_hook);
    elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
    elm_widget_can_focus_set(obj, EINA_TRUE);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   elm_widget_imp_region_get_hook_set(obj, _imp_region_get_hook, NULL);
+#endif
 
    wd->base = edje_object_add(e);
    _elm_theme_object_set(obj, wd->base, "editfield", "base", "default");
@@ -282,6 +311,9 @@ elm_editfield_add(Evas_Object *parent)
    edje_object_part_swallow(wd->base, "elm.swallow.content", wd->entry);
    evas_object_smart_callback_add(wd->entry, "changed", _entry_changed_cb, obj);
    elm_widget_sub_object_add(obj, wd->entry);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   evas_object_smart_callback_add(wd->entry, SIG_CURSOR_CHANGED, _entry_cursor_changed_cb, obj); 
+#endif
 
    _sizing_eval(obj);
 
index ad40116..88351b6 100644 (file)
@@ -190,6 +190,9 @@ static const char SIG_SELECTION_CHANGED[] = "selection,changed";
 static const char SIG_SELECTION_CLEARED[] = "selection,cleared";
 static const char SIG_CURSOR_CHANGED[] = "cursor,changed";
 static const char SIG_ANCHOR_CLICKED[] = "anchor,clicked";
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static const char SIG_IMPREGION_CHANGED[] = "impregion,changed";
+#endif
 static const Evas_Smart_Cb_Description _signals[] = {
   {SIG_CHANGED, ""},
   {SIG_ACTIVATED, ""},
@@ -396,6 +399,23 @@ _check_enable_returnkey(Evas_Object *obj)
      }
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+static Evas_Object *
+_imp_region_get_hook(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Evas_Coord cx = 0, cy = 0, cw = 0, ch = 0;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   edje_object_part_text_cursor_geometry_get(wd->ent, "elm.text",
+                                             &cx, &cy, &cw, &ch);
+   if (x) *x = cx;
+   if (y) *y = cy;
+   if (w) *w = cw;
+   if (h) *h = ch;
+   return NULL;
+}
+#endif
+
 static void
 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
 {
@@ -1200,6 +1220,9 @@ _signal_cursor_changed(void *data, Evas_Object *obj __UNUSED__, const char *emis
        wd->cw = cw;
        wd->ch = ch;
      }
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   evas_object_smart_callback_call(data, SIG_IMPREGION_CHANGED, NULL);
+#endif
 }
 
 static void
@@ -1908,6 +1931,9 @@ elm_entry_add(Evas_Object *parent)
    elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook);
    elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook);
    elm_widget_can_focus_set(obj, 1);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   elm_widget_imp_region_get_hook_set(obj, _imp_region_get_hook, NULL);
+#endif
 
    wd->linewrap     = EINA_TRUE;
    wd->ellipsis     = EINA_FALSE;
index 9062490..1a5d8bb 100644 (file)
@@ -165,6 +165,9 @@ EAPI void         elm_widget_signal_callback_del_hook_set(Evas_Object *obj, void
 EAPI void         elm_widget_theme(Evas_Object *obj);
 EAPI void         elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
 EAPI void         elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+EAPI void         elm_widget_imp_region_get_hook_set(Evas_Object *obj, Evas_Object * (*func) (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h), void *data);
+#endif
 EAPI void         elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data);
 EAPI void         elm_widget_data_set(Evas_Object *obj, void *data);
 EAPI void        *elm_widget_data_get(const Evas_Object *obj);
@@ -189,6 +192,9 @@ EAPI void         elm_widget_activate(Evas_Object *obj);
 EAPI void         elm_widget_change(Evas_Object *obj);
 EAPI void         elm_widget_disabled_set(Evas_Object *obj, int disabled);
 EAPI int          elm_widget_disabled_get(const Evas_Object *obj);
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+EAPI Evas_Object *elm_widget_imp_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
+#endif
 EAPI void         elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
 EAPI void         elm_widget_show_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
 EAPI void         elm_widget_scroll_hold_push(Evas_Object *obj);
index 7727e36..e99c417 100644 (file)
@@ -42,6 +42,9 @@ struct _Smart_Data
    void          *on_focus_data;
    void         (*on_change_func) (void *data, Evas_Object *obj);
    void          *on_change_data;
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+   Evas_Object * (*imp_region_get_func) (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); 
+#endif
    void         (*on_show_region_func) (void *data, Evas_Object *obj);
    void          *on_show_region_data;
    void          *data;
@@ -222,6 +225,15 @@ elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_O
    sd->on_change_data = data;
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+EAPI void
+elm_widget_imp_region_get_hook_set(Evas_Object *obj, Evas_Object * (*func) (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h), void *data)
+{
+   API_ENTRY return;
+   sd->imp_region_get_func = func;
+}
+#endif
+
 EAPI void
 elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data)
 {
@@ -850,6 +862,18 @@ elm_widget_disabled_get(const Evas_Object *obj)
    return sd->disabled;
 }
 
+#ifdef HAVE_CONFORMANT_AUTOSCROLL
+EAPI Evas_Object *
+elm_widget_imp_region_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   API_ENTRY return;
+   if (sd->imp_region_get_func)
+     return sd->imp_region_get_func(obj, x, y, w, h);
+   else
+     return NULL;
+}
+#endif
+
 EAPI void
 elm_widget_show_region_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
 {