e_dnd: use transform core instead of e_map to transform drag window 35/317235/1
authorJunseok Kim <juns.kim@samsung.com>
Mon, 23 Dec 2024 13:18:32 +0000 (22:18 +0900)
committerJunSeok Kim <juns.kim@samsung.com>
Fri, 27 Dec 2024 06:13:21 +0000 (06:13 +0000)
Change-Id: I9c757ed882e9aa84c78a88951cc834fd4080e7e5

src/bin/windowmgr/e_dnd.c
src/bin/windowmgr/e_dnd_intern.h

index 6b6574d7226b23ea0864542c3a8767fcdd2276d1..4b91b2289058d830aa8213530f011da646514c9d 100644 (file)
@@ -23,7 +23,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_map_apply(E_Drag *drag);
+static void           _e_drag_transform_angle(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);
@@ -141,6 +141,7 @@ _e_drag_finalize(E_Drag *drag, int x, int y)
    drag->angle = comp_pointer->rotation;
    e_drag_move(drag, x, y);
    e_drag_resize(drag, drag->w, drag->h);
+   _e_drag_transform_angle(drag);
    drag->visible = 1;
    e_view_show(e_view_edje_view_get(drag->comp_edje));
    e_view_show(drag->view);
@@ -230,15 +231,38 @@ EINTERN void
 e_drag_move(E_Drag *drag, int x, int y)
 {
    int cur_x, cur_y;
-   e_view_edje_geometry_get(drag->comp_edje, &cur_x, &cur_y, NULL, NULL);
-   if ((cur_x == x + drag->dx) && (cur_y == y + drag->dy)) return;
+   int new_x, new_y;
+   int trans_x = 0, trans_y = 0;
+   E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
+   E_Client *ec = comp_wl->drag_client;
+
+   new_x = x + drag->dx;
+   new_y = y + drag->dy;
+
+   if (e_client_transform_core_enable_get(ec))
+     {
+        e_client_transform_core_input_transform(ec, new_x, new_y, &trans_x, &trans_y);
+        if ((cur_x == trans_x) && (cur_y == trans_y)) return;
+     }
+   else
+     {
+        e_view_edje_geometry_get(drag->comp_edje, &cur_x, &cur_y, NULL, NULL);
+        if ((cur_x == new_x) && (cur_y == new_y)) return;
+     }
 
    drag->x = x;
    drag->y = y;
+
    if (_drag_current == drag)
      {
-        e_view_position_set(e_view_edje_view_get(drag->comp_edje), x + drag->dx, y + drag->dy);
-        _e_drag_map_apply(drag);
+        if (e_client_transform_core_enable_get(ec))
+          {
+             e_client_transform_core_input_transform(ec, new_x, new_y, &trans_x, &trans_y);
+             e_view_position_set(e_view_edje_view_get(drag->comp_edje), trans_x, trans_y);
+             e_client_transform_core_update(ec);
+          }
+        else
+          e_view_position_set(e_view_edje_view_get(drag->comp_edje), x + drag->dx, y + drag->dy);
      }
 }
 
@@ -252,7 +276,6 @@ e_drag_resize(E_Drag *drag, int w, int h)
    if (_drag_current == drag)
      {
         e_view_edje_size_set(drag->comp_edje, w, h);
-        _e_drag_map_apply(drag);
      }
 }
 
@@ -288,6 +311,13 @@ _e_drag_end(E_Drag *drag, E_Dnd_Drop_Type type)
      drag->cb.finished(drag, type);
    drag->cb.finished = NULL;
 
+   if (drag->transform)
+     {
+        E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
+        e_client_transform_core_remove(comp_wl->drag_client, drag->transform);
+        e_util_transform_del(drag->transform);
+     }
+
    if (drag->input_grab)
      {
         if (type == E_DND_DRAG_TYPE_CANCELLED_BY_KVM)
@@ -357,44 +387,40 @@ _e_drag_free(E_Drag *drag)
 }
 
 static void
-_e_drag_map_apply(E_Drag *drag)
+_e_drag_transform_angle(E_Drag *drag)
 {
-   int angle, drag_client_w, drag_client_h;
-   E_Map *map = NULL, *new_map = NULL;
-   Eina_Bool need_map_enable;
    E_Comp_Wl_Data *comp_wl;
-   E_View *view;
-
-   angle = drag->angle;
-
-   if (angle == 90)
-      angle = 270;
-   else if (angle == 270)
-      angle = 90;
+   int angle;
 
    comp_wl = e_comp_wl_get();
-   view = e_view_client_view_get(e_client_view_get(comp_wl->drag_client));
-   need_map_enable = e_view_map_enable_get(view) || (angle != 0);
-   if (!need_map_enable) return;
 
-   map = e_client_map_get(comp_wl->drag_client);
+   if (!drag->angle) return;
+   if (e_client_e_state_rot_angle_current_get(comp_wl->drag_client) == drag->angle) return;
 
-   if (map)
-     new_map = e_map_dup(map);
+   if (drag->angle == 90)
+     angle = 270;
+   else if (drag->angle == 270)
+     angle = 90;
    else
-     new_map = e_map_new();
-   if (!new_map) goto fin;
-
-   e_client_geometry_get(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_view_edje_map_set(drag->comp_edje, new_map);
-   e_view_edje_map_enable_set(drag->comp_edje, true);
-
-fin:
-   if (map) e_map_free(map);
-   if (new_map) e_map_free(new_map);
+     angle = drag->angle;
+
+   if (!drag->transform)
+     {
+        ELOGF("DnD", "NEW transform for drag window", comp_wl->drag_client);
+        drag->transform = e_util_transform_new();
+        EINA_SAFETY_ON_NULL_RETURN(drag->transform);
+
+        e_util_transform_role_set(drag->transform, "drag window rotation transform");
+        e_client_transform_core_add(comp_wl->drag_client, drag->transform);
+     }
+
+   ELOGF("DnD", "Drag angle apply, angle:%d", comp_wl->drag_client, angle);
+
+   e_util_transform_rotation_axis_set(drag->transform, drag->x, drag->y, -1);
+   e_util_transform_scale(drag->transform, 1.0, 1.0, 1.0);
+   e_util_transform_move(drag->transform, 0, 0, 0);
+   e_util_transform_rotation(drag->transform, 0, 0, angle);
+   e_client_transform_core_update(comp_wl->drag_client);
 }
 
 static Eina_Bool
index 6d2b3e0f010478b3d05d1bfbd9e2592835faf00e..db304a729651c0f870c1db5ae0c5879f2d35f3dc 100644 (file)
@@ -45,6 +45,8 @@ struct _E_Drag
 
    unsigned char      visible : 1;
    Eina_Bool          input_grab;
+
+   E_Util_Transform *transform;
 };
 
 EINTERN int e_dnd_init(void);