Index: src/lib/elm_access.c
===================================================================
--- src/lib/elm_access.c	(리비전 70687)
+++ src/lib/elm_access.c	(작업 사본)
@@ -12,7 +12,10 @@ struct _Mod_Api
 };
 
 static int initted = 0;
+static Eina_Bool double_tap = EINA_FALSE;
 static Mod_Api *mapi = NULL;
+static Evas_Object *event_rect = NULL;
+static Evas_Object *hilight_obj = NULL;
 
 static void
 _access_init(void)
@@ -68,6 +71,7 @@ _access_obj_over_timeout_cb(void *data)
    if (!ac) return EINA_FALSE;
    if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
      {
+        hilight_obj = data;
         _elm_access_object_hilight(data);
         _elm_access_read(ac, ELM_ACCESS_CANCEL, data, NULL);
         _elm_access_read(ac, ELM_ACCESS_TYPE,   data, NULL);
@@ -82,6 +86,8 @@ _access_obj_over_timeout_cb(void *data)
 static void
 _access_obj_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info  __UNUSED__)
 {
+   if (double_tap) return;
+
    Elm_Access_Info *ac = evas_object_data_get(data, "_elm_access");
    if (!ac) return;
 
@@ -405,10 +411,67 @@ _elm_access_object_hilight_disable(Evas *e)
    evas_object_del(o);
 }
 
+static void
+_event_rect_mouse_up_cb(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   evas_object_repeat_events_set(event_rect, EINA_FALSE);
+}
+
+static Evas_Event_Flags
+_tap_end_cb(void *data __UNUSED__, void *event_info)
+{
+   if (double_tap)
+     {
+        double_tap = EINA_FALSE;
+        return EVAS_EVENT_FLAG_NONE;
+     }
+
+   Elm_Gesture_Taps_Info *ti = (Elm_Gesture_Taps_Info *)event_info;
+   if (!ti) return EVAS_EVENT_FLAG_NONE;
+
+   evas_object_repeat_events_set(event_rect, EINA_TRUE);
+   evas_event_feed_mouse_in(evas_object_evas_get(event_rect),
+                            ti->timestamp, NULL);
+   evas_object_repeat_events_set(event_rect, EINA_FALSE);
+   return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+_double_tap_end_cb(void *data __UNUSED__, void *event_info)
+{
+   Evas *e;
+   Evas_Coord x, y, w, h;
+   Elm_Gesture_Taps_Info *ti = (Elm_Gesture_Taps_Info *)event_info;
+   if (!ti) return EVAS_EVENT_FLAG_NONE;
+
+   // feed mouse down, up event to the middle of highlight object
+   evas_object_geometry_get(hilight_obj, &x, &y, &w, &h);
+   x = x + (w / 2);
+   y = y + (h / 2);
+
+   e = evas_object_evas_get(event_rect);
+   evas_object_repeat_events_set(event_rect, EINA_TRUE);
+   evas_event_feed_mouse_move(e, x, y, ti->timestamp, NULL);
+   evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, ti->timestamp, NULL);
+   evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, ti->timestamp, NULL);
+   evas_object_repeat_events_set(event_rect, EINA_FALSE);
+   double_tap = EINA_TRUE;
+
+   return EVAS_EVENT_FLAG_NONE;
+}
+
+static Evas_Event_Flags
+_long_tap_start_cb(void *data __UNUSED__, void *event_info __UNUSED__)
+{
+   evas_object_repeat_events_set(event_rect, EINA_TRUE);
+   return EVAS_EVENT_FLAG_NONE;
+}
+
 EAPI void
 _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj)
 {
    Elm_Access_Info *ac;
+   Evas_Object *top, *ges;
 
    evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_IN,
                                   _access_obj_mouse_in_cb, obj);
@@ -418,6 +481,37 @@ _elm_access_object_register(Evas_Object *obj, Evas
                                   _access_obj_del_cb, obj);
    ac = calloc(1, sizeof(Elm_Access_Info));
    evas_object_data_set(obj, "_elm_access", ac);
+
+   // event_rect is not necessary on the desktop environments
+   if (_elm_config->desktop_access) return;
+
+   // multiple rectangles are not necessary
+   if (event_rect) return;
+
+   top = elm_widget_top_get(obj);
+   event_rect = evas_object_rectangle_add(evas_object_evas_get(top));
+   evas_object_color_set(event_rect, 0, 125, 0, 100);
+   elm_win_resize_object_add(top, event_rect);
+   evas_object_size_hint_weight_set(event_rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_repeat_events_set(event_rect, EINA_FALSE);
+   evas_object_pointer_mode_set(event_rect, EVAS_OBJECT_POINTER_MODE_NOGRAB);
+   evas_object_event_callback_add(event_rect, EVAS_CALLBACK_MOUSE_UP,
+                                  _event_rect_mouse_up_cb, obj);
+   evas_object_show(event_rect);
+
+   ges = elm_gesture_layer_add(obj);
+   if (!ges) ERR("elm_gesture_layer_add() failed");
+
+   elm_gesture_layer_attach(ges, event_rect);
+   elm_gesture_layer_cb_set(ges, ELM_GESTURE_N_TAPS,
+                            ELM_GESTURE_STATE_END,
+                            _tap_end_cb, NULL);
+   elm_gesture_layer_cb_set(ges, ELM_GESTURE_N_DOUBLE_TAPS,
+                            ELM_GESTURE_STATE_END,
+                            _double_tap_end_cb, NULL);
+   elm_gesture_layer_cb_set(ges, ELM_GESTURE_N_LONG_TAPS,
+                            ELM_GESTURE_STATE_START,
+                            _long_tap_start_cb, NULL);
 }
 
 static Eina_Bool
Index: src/lib/elm_config.c
===================================================================
--- src/lib/elm_config.c	(리비전 70687)
+++ src/lib/elm_config.c	(작업 사본)
@@ -364,6 +364,7 @@ _desc_init(void)
    ELM_CONFIG_VAL(D, T, longpress_timeout, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, effect_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, desktop_entry, T_UCHAR);
+   ELM_CONFIG_VAL(D, T, desktop_access, T_UCHAR);
    ELM_CONFIG_VAL(D, T, password_show_last, T_UCHAR);
    ELM_CONFIG_VAL(D, T, password_show_last_timeout, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, glayer_zoom_finger_enable, T_UCHAR);
@@ -1018,6 +1019,7 @@ _config_load(void)
    _elm_config->longpress_timeout = 1.0;
    _elm_config->effect_enable = EINA_TRUE;
    _elm_config->desktop_entry = EINA_FALSE;
+   _elm_config->desktop_access = EINA_TRUE;
    _elm_config->is_mirrored = EINA_FALSE; /* Read sys value in env_get() */
    _elm_config->password_show_last = EINA_FALSE;
    _elm_config->password_show_last_timeout = 2.0;
@@ -1526,6 +1528,8 @@ _env_get(void)
    if (s) _elm_config->desktop_entry = !!atoi(s);
    s = getenv("ELM_ACCESS_MODE");
    if (s) _elm_config->access_mode = ELM_ACCESS_MODE_ON;
+   s = getenv("ELM_DESKTOP_ACCESS");
+   if (s) _elm_config->desktop_access = !!atoi(s);
 }
 
 EAPI Eina_Bool
Index: src/lib/elm_priv.h
===================================================================
--- src/lib/elm_priv.h	(리비전 70687)
+++ src/lib/elm_priv.h	(작업 사본)
@@ -166,6 +166,7 @@ struct _Elm_Config
    unsigned int  glayer_flick_time_limit_ms;
    double        glayer_long_tap_start_timeout;
    int           access_mode;
+   unsigned char desktop_access;
    Eina_Bool     glayer_continues_enable;
    int           week_start;
    int           weekend_start;
Index: src/lib/elm_button.c
===================================================================
--- src/lib/elm_button.c	(리비전 70687)
+++ src/lib/elm_button.c	(작업 사본)
@@ -277,7 +277,8 @@ _activate(Evas_Object *obj)
         wd->timer = NULL;
      }
    wd->repeating = EINA_FALSE;
-   if ((_elm_config->access_mode == ELM_ACCESS_MODE_OFF) ||
+   if ((!_elm_config->desktop_access) ||
+       (_elm_config->access_mode == ELM_ACCESS_MODE_OFF) ||
        (_elm_access_2nd_click_timeout(obj)))
      {
         if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
Index: config/default/base.src
===================================================================
--- config/default/base.src	(리비전 70687)
+++ config/default/base.src	(작업 사본)
@@ -42,6 +42,7 @@ group "Elm_Config" struct {
   value "longpress_timeout" double: 1.0;
   value "effect_enable" uchar: 1;
   value "desktop_entry" uchar: 0;
+  value "desktop_access" uchar: 1;
   value "password_show_last" uchar: 0;
   value "password_show_last_timeout" double: 2.0;
   value "glayer_zoom_finger_enable" uchar: 1;
Index: ChangeLog
===================================================================
--- ChangeLog	(리비전 70687)
+++ ChangeLog	(작업 사본)
@@ -31,3 +31,7 @@
 
 	* Add feature about focus. Focus can be moved in all direction by
 	  by elm_widget_focus_go function.
+
+2012-05-03  Shinwoo Kim (kimcinoo)
+
+	* Access: Add initial features for mobile device environment.
