summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafal Mielniczuk <rafal.mielniczuk2@gmail.com>2012-03-21 22:40:20 +0100
committerKristian Høgsberg <krh@bitplanet.net>2012-03-22 10:44:27 -0400
commit778e629b95c21dfca70d4705baaa1f7e9203fd25 (patch)
treee2fb96eed82cea1e26d5eaafe7d632df1563d402
parent126f85535f72dbe7fccf9b1a32994727a90ffa3d (diff)
shell: correct position of a surface before rotating it.
How to reproduce: rotate the surface to something like 45 degrees, resize it drastically, continue to rotate. The surface will jump some space and the rotation point will not be in the center of the surface. Fix is to shift the surface position to match the rotation point
-rw-r--r--src/shell.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/shell.c b/src/shell.c
index fa51922..3203dc9 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -1284,7 +1284,7 @@ rotate_binding(struct wl_input_device *device, uint32_t time,
(struct weston_surface *) device->pointer_focus;
struct shell_surface *surface;
struct rotate_grab *rotate;
- GLfloat dx, dy;
+ GLfloat dx, dy, cx, cy, cposx, cposy, dposx, dposy;
GLfloat r;
if (base_surface == NULL)
@@ -1335,6 +1335,20 @@ rotate_binding(struct wl_input_device *device, uint32_t time,
weston_matrix_init(&rotate->rotation);
}
+ /* We need to adjust the position of the surface
+ * in case it was resized in a rotated state before */
+ cx = 0.5f * surface->surface->geometry.width;
+ cy = 0.5f * surface->surface->geometry.height;
+ cposx = surface->surface->geometry.x + cx;
+ cposy = surface->surface->geometry.y + cy;
+ dposx = rotate->center.x - cposx;
+ dposy = rotate->center.y - cposy;
+ if (dposx != 0 || dposy != 0) {
+ weston_surface_set_position(base_surface,
+ base_surface->geometry.x + dposx,
+ base_surface->geometry.y + dposy);
+ }
+
wl_input_device_set_pointer_focus(device, NULL, time, 0, 0);
}