/* 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);
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);
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);
}
}
if (_drag_current == drag)
{
e_view_edje_size_set(drag->comp_edje, w, h);
- _e_drag_map_apply(drag);
}
}
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)
}
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