e_comp_wl: move a cursor follow global positon 10/216210/8
authorjeon <jhyuni.kang@samsung.com>
Tue, 22 Oct 2019 08:05:33 +0000 (17:05 +0900)
committerJeongHyun Kang <jhyuni.kang@samsung.com>
Thu, 12 Dec 2019 08:19:22 +0000 (08:19 +0000)
  - The enlightenment set evas_map to client for transform/zoom.
  - If an evas_map is set, mouse event's axis is changed but this
    changed axis is an window axis, so this is not matched to cursor position.
  - So get global position to calculate inverse from evas event's axis

Change-Id: I7c237b042f9f48e0b60f6a1f0efe25fc64836594

src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_desk.c
src/bin/e_devicemgr_input.c

index f957d438a44946147734aaef3eb4db91e89cd11e..1f78d00a53e5a81b0529e1cdb3a789785bb6bc81 100644 (file)
@@ -411,6 +411,52 @@ e_comp_wl_map_apply(E_Client *ec)
    e_client_transform_core_update(ec);
 }
 
+EINTERN void
+e_comp_wl_map_inv_coord_get(E_Client *ec, int x, int y, int *mx, int *my)
+{
+   const Evas_Map *map;
+   int map_c;
+   int min_x = 0, min_y = 0, max_x = 0, max_y = 0;
+   int map_x = 0, map_y = 0;
+   double diff_w, diff_h;
+
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   map = evas_object_map_get(ec->frame);
+   map_c = evas_map_count_get(map);
+
+   if (!map || map_c <= 0)
+     {
+        *mx = x;
+        *my = y;
+        return;
+     }
+
+   for (int i = 0; i < map_c; i++)
+     {
+        evas_map_point_coord_get(map, i, &map_x, &map_y, NULL);
+        if (i == 0)
+          {
+             min_x = max_x = map_x;
+             min_y = max_y = map_y;
+          }
+        else
+          {
+             if (min_x > map_x) min_x = map_x;
+             else if (max_x < map_x) max_x = map_x;
+
+             if (min_y > map_y) min_y = map_y;
+             else if (max_y < map_y) max_y = map_y;
+          }
+     }
+
+   diff_w = (double)(max_x - min_x) / (double)ec->w;
+   diff_h = (double)(max_y - min_y) / (double)ec->h;
+
+   *mx = (int)(x * diff_w) + min_x;
+   *my = (int)(y * diff_h) + min_y;
+}
+
 static void
 _e_comp_wl_evas_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
 {
@@ -1179,7 +1225,16 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
                                                   ec, 0, ev->radius_x, ev->radius_y, ev->pressure, ev->angle);
                   _e_comp_wl_send_touch_move(ec, 0, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp);
                }
-             e_pointer_touch_move(e_comp->pointer, ev->cur.output.x, ev->cur.output.y);
+
+             pointer_x = ev->cur.output.x;
+             pointer_y = ev->cur.output.y;
+
+             if (evas_object_map_enable_get(ec->frame))
+               {
+                  e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y);
+               }
+
+             e_pointer_touch_move(e_comp->pointer, pointer_x, pointer_y);
           }
         else
           {
@@ -1194,8 +1249,11 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
 
              pointer_x = ev->cur.output.x;
              pointer_y = ev->cur.output.y;
-             if (e_client_transform_core_enable_get(ec))
-               e_client_transform_core_input_inv_rect_transform(ec, pointer_x, pointer_y, &pointer_x, &pointer_y);
+
+             if (evas_object_map_enable_get(ec->frame))
+               {
+                  e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y);
+               }
 
              e_pointer_mouse_move(e_comp->pointer, pointer_x, pointer_y);
              if (e_config->use_cursor_timer)
@@ -1244,7 +1302,16 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
           _e_comp_wl_device_renew_axis(dev_name, evas_device_class_get(dev),
                                         ec, 0, ev->radius_x, ev->radius_y, ev->pressure, ev->angle);
         _e_comp_wl_evas_handle_mouse_button_to_touch(ec, ev->timestamp, ev->canvas.x, ev->canvas.y, EINA_TRUE);
-        e_pointer_touch_move(e_comp->pointer, ev->output.x, ev->output.y);
+
+        pointer_x = ev->output.x;
+        pointer_y = ev->output.y;
+
+        if (evas_object_map_enable_get(ec->frame))
+          {
+             e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y);
+          }
+
+        e_pointer_touch_move(e_comp->pointer, pointer_x, pointer_y);
         e_comp_wl->touch.pressed |= (1 << 0);
      }
    else
@@ -1259,8 +1326,11 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
                                            WL_POINTER_BUTTON_STATE_PRESSED);
         pointer_x = ev->output.x;
         pointer_y = ev->output.y;
-        if (e_client_transform_core_enable_get(ec))
-          e_client_transform_core_input_inv_rect_transform(ec, pointer_x, pointer_y, &pointer_x, &pointer_y);
+
+        if (evas_object_map_enable_get(ec->frame))
+          {
+             e_comp_wl_map_inv_coord_get(ec, pointer_x, pointer_y, &pointer_x, &pointer_y);
+          }
 
         e_pointer_mouse_move(e_comp->pointer, pointer_x, pointer_y);
         if (e_config->use_cursor_timer)
index d0e7cc2f1b085829f7925867dcad904803a7e891..49693b4747f8ae53b44236000d821d16372c12ad 100644 (file)
@@ -573,6 +573,8 @@ E_API void e_comp_wl_map_size_cal_from_buffer(E_Client *ec);
 E_API void e_comp_wl_map_size_cal_from_viewport(E_Client *ec);
 E_API void e_comp_wl_map_apply(E_Client *ec);
 
+EINTERN void e_comp_wl_map_inv_coord_get(E_Client *ec, int x, int y, int *mx, int *my);
+
 E_API void e_comp_wl_input_cursor_timer_enable_set(Eina_Bool enabled);
 EINTERN void e_comp_wl_send_event_device(struct wl_client *wc, uint32_t timestamp, Ecore_Device *dev, uint32_t serial);
 
index 326683f8e1dca812df7f98b91b394c1f24853cd7..f89a381d80496cdcadd3ef331e540d3d6f53ba20 100644 (file)
@@ -950,9 +950,14 @@ e_desk_zoom_set(E_Desk *desk, double zoomx, double zoomy, int cx, int cy)
           {
              sd->zoom.enabled = EINA_TRUE;
 
-             evas_object_map_enable_set(desk->smart_obj, EINA_TRUE);
-             EINA_LIST_FOREACH(sd->clients, l, ec)
-               evas_object_map_enable_set(ec->frame, EINA_TRUE);
+             /*
+              * NOTE: evas_object_map_enable_set is called in _e_desk_client_zoom()
+              */
+             /*
+              * evas_object_map_enable_set(desk->smart_obj, EINA_TRUE);
+              * EINA_LIST_FOREACH(sd->clients, l, ec)
+              *   evas_object_map_enable_set(ec->frame, EINA_TRUE);
+              */
 
              /* FIXME TEMP disable hwc */
              _e_desk_util_comp_hwc_disable_set(EINA_TRUE);
@@ -1051,7 +1056,12 @@ e_desk_zoom_unset(E_Desk *desk)
 
         _e_desk_object_zoom(desk->smart_obj, sd->zoom.ratio_x, sd->zoom.ratio_y,
                             sd->zoom.cord_x, sd->zoom.cord_y);
-        evas_object_map_enable_set(desk->smart_obj, EINA_FALSE);
+        /*
+         * NOTE: evas_object_map_enable_set is called in _e_desk_client_zoom()
+         */
+        /*
+         * evas_object_map_enable_set(desk->smart_obj, EINA_FALSE);
+         */
         EINA_LIST_FOREACH(sd->clients, l, ec)
           {
              /* NOTE Is it really necessary?
@@ -1460,6 +1470,8 @@ _e_desk_client_zoom(E_Client *ec, double zoomx, double zoomy, Evas_Coord cx, Eva
    Eina_Bool transformed;
    transformed = e_client_transform_core_enable_get(ec);
 
+   if (ec->is_cursor) return;
+
    if (transformed)
      e_client_transform_core_update_with_desk_zoom(ec);
    else
index 1ecc4e9a1b52279be7ec8856fb09fb06302f9e8d..aa960e5a14456fc6883130876a0b1b8bfd63ef45 100644 (file)
@@ -53,9 +53,11 @@ e_devicemgr_input_pointer_warp(struct wl_client *client, struct wl_resource *res
 
    new_x = wl_fixed_to_int(x);
    new_y = wl_fixed_to_int(y);
-   if (e_client_transform_core_enable_get(ec))
-     e_client_transform_core_input_inv_rect_transform(ec, wl_fixed_to_int(x), wl_fixed_to_int(y), &new_x, &new_y);
 
+   if (evas_object_map_enable_get(ec->frame))
+     {
+        e_comp_wl_map_inv_coord_get(ec, new_x, new_y, &new_x, &new_y);
+     }
    ret = _e_devicemgr_input_pointer_warp(ec->client.x + new_x, ec->client.y + new_y);
    return ret;
 }