woohyun pushed a commit to branch master.
commit f0d3f79b375eb1a6df91e378e6214dd425253eb1
Author: WooHyun Jung <[email protected]>
Date: Thu Jul 11 17:47:25 2013 +0900
We can change the focusable state of elm_layout by calling
elm_object_focus_allow_set from application side.
---
src/lib/elm_layout.c | 10 ++++-
src/lib/elm_widget.c | 122 +++++++++++++++++++++++----------------------------
2 files changed, 62 insertions(+), 70 deletions(-)
diff --git a/src/lib/elm_layout.c b/src/lib/elm_layout.c
index b92917a..a8d7417 100644
--- a/src/lib/elm_layout.c
+++ b/src/lib/elm_layout.c
@@ -395,7 +395,10 @@ static void
_elm_layout_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd
EINA_UNUSED, va_list *list)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
- *ret = EINA_TRUE;
+ if (!elm_widget_can_focus_get(obj))
+ *ret = EINA_TRUE;
+ else
+ *ret = EINA_FALSE;
}
/* WARNING: if you're making a widget *not* supposed to have focusable
* child objects, but still inheriting from elm_layout, just set its
@@ -501,7 +504,10 @@ static void
_elm_layout_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd
EINA_UNUSED, va_list *list)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
- *ret = EINA_TRUE;
+ if (!elm_widget_can_focus_get(obj))
+ *ret = EINA_TRUE;
+ else
+ *ret = EINA_FALSE;
}
static void
diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c
index 54266ee..f3d2fe9 100644
--- a/src/lib/elm_widget.c
+++ b/src/lib/elm_widget.c
@@ -173,6 +173,53 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] =
};
static void
+_obj_mouse_down(void *data,
+ Evas *e __UNUSED__,
+ Evas_Object *obj __UNUSED__,
+ void *event_info)
+{
+ ELM_WIDGET_DATA_GET(data, sd);
+ Evas_Event_Mouse_Down *ev = event_info;
+ if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
+ sd->still_in = EINA_TRUE;
+}
+
+static void
+_obj_mouse_move(void *data,
+ Evas *e __UNUSED__,
+ Evas_Object *obj,
+ void *event_info)
+{
+ ELM_WIDGET_DATA_GET(data, sd);
+ Evas_Event_Mouse_Move *ev = event_info;
+ if (sd->still_in)
+ {
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ sd->still_in = EINA_FALSE;
+ else
+ {
+ Evas_Coord x, y, w, h;
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ if ((ev->cur.canvas.x < x) || (ev->cur.canvas.y < y) ||
+ (ev->cur.canvas.x >= (x + w)) || (ev->cur.canvas.y >= (y +
h)))
+ sd->still_in = EINA_FALSE;
+ }
+ }
+}
+
+static void
+_obj_mouse_up(void *data,
+ Evas *e __UNUSED__,
+ Evas_Object *obj,
+ void *event_info __UNUSED__)
+{
+ ELM_WIDGET_DATA_GET(data, sd);
+ if (sd->still_in)
+ elm_widget_focus_mouse_up_handle(obj);
+ sd->still_in = EINA_FALSE;
+}
+
+static void
_elm_widget_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
{
@@ -184,6 +231,12 @@ _elm_widget_smart_add(Eo *obj, void *_pd, va_list *list
EINA_UNUSED)
elm_widget_can_focus_set(obj, EINA_TRUE);
elm_widget_mirrored_set(obj, elm_config_mirrored_get());
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
+ _obj_mouse_down, obj);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
+ _obj_mouse_move, obj);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
+ _obj_mouse_up, obj);
/* just a helper for inheriting classes */
if (priv->resize_obj)
{
@@ -460,53 +513,6 @@ _elm_widget_focus_direction_manager_is(const Evas_Object
*obj)
}
static void
-_obj_mouse_down(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj __UNUSED__,
- void *event_info)
-{
- ELM_WIDGET_DATA_GET(data, sd);
- Evas_Event_Mouse_Down *ev = event_info;
- if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
- sd->still_in = EINA_TRUE;
-}
-
-static void
-_obj_mouse_move(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj,
- void *event_info)
-{
- ELM_WIDGET_DATA_GET(data, sd);
- Evas_Event_Mouse_Move *ev = event_info;
- if (sd->still_in)
- {
- if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
- sd->still_in = EINA_FALSE;
- else
- {
- Evas_Coord x, y, w, h;
- evas_object_geometry_get(obj, &x, &y, &w, &h);
- if ((ev->cur.canvas.x < x) || (ev->cur.canvas.y < y) ||
- (ev->cur.canvas.x >= (x + w)) || (ev->cur.canvas.y >= (y +
h)))
- sd->still_in = EINA_FALSE;
- }
- }
-}
-
-static void
-_obj_mouse_up(void *data,
- Evas *e __UNUSED__,
- Evas_Object *obj,
- void *event_info __UNUSED__)
-{
- ELM_WIDGET_DATA_GET(data, sd);
- if (sd->still_in)
- elm_widget_focus_mouse_up_handle(obj);
- sd->still_in = EINA_FALSE;
-}
-
-static void
_propagate_x_drag_lock(Evas_Object *obj,
int dir)
{
@@ -1187,19 +1193,7 @@ _elm_widget_resize_object_set(Eo *obj, void *_pd,
va_list *list)
}
sd->resize_obj = sobj;
- if (!sobj)
- {
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_DOWN,
- _obj_mouse_down, obj);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_MOVE,
- _obj_mouse_move, obj);
- evas_object_event_callback_del_full(obj,
- EVAS_CALLBACK_MOUSE_UP,
- _obj_mouse_up, obj);
- return;
- }
+ if (!sobj) return;
// orphan new resize obj
parent = evas_object_data_get(sobj, "elm-parent");
@@ -1216,17 +1210,9 @@ _elm_widget_resize_object_set(Eo *obj, void *_pd,
va_list *list)
elm_widget_sub_object_del(parent, sobj);
}
}
-
elm_widget_sub_object_add(obj, sobj);
-
evas_object_smart_member_add(sobj, obj);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
- _obj_mouse_down, obj);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE,
- _obj_mouse_move, obj);
- evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP,
- _obj_mouse_up, obj);
_smart_reconfigure(sd);
}
--
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk