surface->buffer_destroy_listener.func = surface_handle_buffer_destroy;
wl_list_init(&surface->geometry.transformation_list);
+ wl_list_insert(&surface->geometry.transformation_list,
+ &surface->transform.position.link);
+ weston_matrix_init(&surface->transform.position.matrix);
surface->geometry.dirty = 1;
return surface;
surface->geometry.dirty = 0;
- if (wl_list_empty(&surface->geometry.transformation_list)) {
+ /* transform.position is always in transformation_list */
+ if (surface->geometry.transformation_list.next ==
+ &surface->transform.position.link &&
+ surface->geometry.transformation_list.prev ==
+ &surface->transform.position.link) {
surface->transform.enabled = 0;
return;
}
surface->transform.enabled = 1;
+ surface->transform.position.matrix.d[12] = surface->x;
+ surface->transform.position.matrix.d[13] = surface->y;
+
weston_matrix_init(matrix);
wl_list_for_each(tform, &surface->geometry.transformation_list, link)
weston_matrix_multiply(matrix, &tform->matrix);
if (surface->transform.enabled) {
struct weston_vector v = { { sx, sy, 0.0f, 1.0f } };
- v.f[0] += surface->x;
- v.f[1] += surface->y;
-
weston_matrix_transform(&surface->transform.matrix, &v);
if (fabsf(v.f[3]) < 1e-6) {
return;
}
- *sx = v.f[0] / v.f[3] - surface->x;
- *sy = v.f[1] / v.f[3] - surface->y;
+ *sx = v.f[0] / v.f[3];
+ *sy = v.f[1] / v.f[3];
} else {
*sx = x - surface->x;
*sy = y - surface->y;
surface->y = y;
surface->width = width;
surface->height = height;
+ surface->geometry.dirty = 1;
weston_surface_assign_output(surface);
weston_surface_damage(surface);
wd->sprite->x = device->x - wd->hotspot_x;
wd->sprite->y = device->y - wd->hotspot_y;
+ wd->sprite->geometry.dirty = 1;
weston_surface_damage(wd->sprite);
}
device->sprite->height = buffer->height;
device->sprite->x = device->input_device.x - device->hotspot_x;
device->sprite->y = device->input_device.y - device->hotspot_y;
+ device->sprite->geometry.dirty = 1;
weston_surface_damage(device->sprite);
}