compositor: split drag surface update into smaller functions

Ander Conselvan de Oliveira 13 years ago committed by Kristian Høgsberg
parent c5fb9a7de9
commit 3e3bb3216e
  1. 58
      src/compositor.c

@ -1897,6 +1897,42 @@ weston_input_device_release(struct weston_input_device *device)
wl_input_device_release(&device->input_device); wl_input_device_release(&device->input_device);
} }
static void
device_setup_new_drag_surface(struct weston_input_device *device,
struct weston_surface *surface)
{
struct wl_input_device *input_device = &device->input_device;
device->drag_surface = surface;
weston_surface_set_position(device->drag_surface,
input_device->x, input_device->y);
wl_list_insert(surface->surface.resource.destroy_listener_list.prev,
&device->drag_surface_destroy_listener.link);
}
static void
device_release_drag_surface(struct weston_input_device *device)
{
undef_region(&device->drag_surface->input);
wl_list_remove(&device->drag_surface_destroy_listener.link);
device->drag_surface = NULL;
}
static void
device_map_drag_surface(struct weston_input_device *device)
{
if (device->drag_surface->output ||
!device->drag_surface->buffer)
return;
wl_list_insert(&device->sprite->layer_link,
&device->drag_surface->layer_link);
weston_surface_assign_output(device->drag_surface);
empty_region(&device->drag_surface->input);
}
static void static void
weston_input_update_drag_surface(struct wl_input_device *input_device, weston_input_update_drag_surface(struct wl_input_device *input_device,
int dx, int dy) int dx, int dy)
@ -1915,30 +1951,20 @@ weston_input_update_drag_surface(struct wl_input_device *input_device,
surface_changed = 1; surface_changed = 1;
if (!input_device->drag_surface || surface_changed) { if (!input_device->drag_surface || surface_changed) {
undef_region(&device->drag_surface->input); device_release_drag_surface(device);
wl_list_remove(&device->drag_surface_destroy_listener.link);
device->drag_surface = NULL;
if (!surface_changed) if (!surface_changed)
return; return;
} }
if (!device->drag_surface || surface_changed) { if (!device->drag_surface || surface_changed) {
device->drag_surface = (struct weston_surface *) struct weston_surface *surface = (struct weston_surface *)
input_device->drag_surface; input_device->drag_surface;
device_setup_new_drag_surface(device, surface);
weston_surface_set_position(device->drag_surface,
input_device->x, input_device->y);
wl_list_insert(device->drag_surface->surface.resource.destroy_listener_list.prev,
&device->drag_surface_destroy_listener.link);
} }
if (device->drag_surface->output == NULL && /* the client may not have attached a buffer to the drag surface
device->drag_surface->buffer) { * when we setup it up, so check if map is needed on every update */
wl_list_insert(&device->sprite->layer_link, device_map_drag_surface(device);
&device->drag_surface->layer_link);
weston_surface_assign_output(device->drag_surface);
empty_region(&device->drag_surface->input);
}
/* the client may have attached a buffer with a different size to /* the client may have attached a buffer with a different size to
* the drag surface, causing the input region to be reset */ * the drag surface, causing the input region to be reset */

Loading…
Cancel
Save