e_dnd: Use e_map to drag object if drag_client transformed 70/299970/1
authorJunseok Kim <juns.kim@samsung.com>
Thu, 12 Oct 2023 13:18:48 +0000 (22:18 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 13 Oct 2023 04:12:42 +0000 (13:12 +0900)
Change-Id: I10fd155d070942ba06552c27e2b98745896ceb01

src/bin/e_dnd.c

index 582a8d2..d59da39 100644 (file)
@@ -12,7 +12,7 @@ struct _E_Drag_Hook
 /* local subsystem functions */
 static void           _e_drag_end(E_Drag *drag, E_Dnd_Drop_Type type);
 static void           _e_drag_free(E_Drag *drag);
-static void           _e_drag_rotation_angle_map_adjust(E_Drag *drag);
+static void           _e_drag_map_apply(E_Drag *drag);
 
 static Eina_Bool      _e_dnd_cb_mouse_up(void *data, int type, void *event);
 static Eina_Bool      _e_dnd_cb_mouse_move(void *data, int type, void *event);
@@ -223,7 +223,10 @@ e_drag_move(E_Drag *drag, int x, int y)
    drag->x = x;
    drag->y = y;
    if (_drag_current == drag)
-     evas_object_move(drag->comp_object, x + drag->dx, y + drag->dy);
+     {
+       evas_object_move(drag->comp_object, x + drag->dx, y + drag->dy);
+       _e_drag_map_apply(drag);
+     }
 }
 
 EINTERN void
@@ -236,7 +239,7 @@ e_drag_resize(E_Drag *drag, int w, int h)
    if (_drag_current == drag)
      {
         evas_object_resize(drag->comp_object, w, h);
-        _e_drag_rotation_angle_map_adjust(drag);
+        _e_drag_map_apply(drag);
      }
 }
 
@@ -302,37 +305,38 @@ _e_drag_free(E_Drag *drag)
 }
 
 static void
-_e_drag_rotation_angle_map_adjust(E_Drag *drag)
+_e_drag_map_apply(E_Drag *drag)
 {
-   int angle;
-   E_Map *map;
-
-   map = e_map_new();
-   EINA_SAFETY_ON_NULL_RETURN(map);
+   int angle, drag_client_w, drag_client_h;
+   E_Map *map = NULL, *new_map = NULL;
+   Eina_Bool need_map_enable;
 
    angle = drag->angle;
 
-   if (angle)
-     {
-        if (angle == 90)
-          angle = 270;
-        else if (angle == 270)
-          angle = 90;
+   if (angle == 90)
+      angle = 270;
+   else if (angle == 270)
+      angle = 90;
 
-        e_map_util_points_populate_from_object_full(map, drag->comp_object, 0);
+   need_map_enable = evas_object_map_enable_get(e_comp_wl->drag_client->frame) || (angle != 0);
+   if (!need_map_enable) return;
 
-        e_map_util_rotate(map, angle, drag->x, drag->y);
-        e_map_util_object_move_sync_set(map, EINA_TRUE);
-        e_comp_object_map_set(drag->comp_object, map);
-        e_comp_object_map_enable_set(drag->comp_object, EINA_TRUE);
-     }
-   else
-     {
-        e_comp_object_map_set(drag->comp_object, NULL);
-        e_comp_object_map_enable_set(drag->comp_object, EINA_FALSE);
-     }
+   map = e_client_map_get(e_comp_wl->drag_client);
+   if (!map) return;
+
+   new_map = e_map_dup(map);
+   if (!new_map) goto fin;
+
+   e_client_geometry_get(e_comp_wl->drag_client, NULL, NULL, &drag_client_w, &drag_client_h);
+   e_map_util_points_populate_from_geometry(new_map, drag->x, drag->y, drag_client_w, drag_client_h, 0);
+   e_map_util_rotate(new_map, angle, drag->x, drag->y);
+   e_map_util_object_move_sync_set(new_map, EINA_TRUE);
+   e_comp_object_map_set(drag->comp_object, new_map);
+   e_comp_object_map_enable_set(drag->comp_object, EINA_TRUE);
 
-   e_map_free(map);
+fin:
+   if (map) e_map_free(map);
+   if (new_map) e_map_free(new_map);
 }
 
 static Eina_Bool