diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 17:05:13 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2009-09-18 17:05:50 -0400 |
commit | 3f8f39c01934493eaf98c3e24954c82e98dccf65 (patch) | |
tree | 4431391a22df89bf78069e3800c2dca0f7ed2105 | |
parent | dd73dd5c81673b2da0095a2c8edce964a3453861 (diff) |
Remove surfaces when destroyed, refocus pointer
-rw-r--r-- | wayland-system-compositor.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/wayland-system-compositor.c b/wayland-system-compositor.c index 3c8491f..02cf84c 100644 --- a/wayland-system-compositor.c +++ b/wayland-system-compositor.c @@ -369,6 +369,10 @@ wlsc_surface_destroy(struct wlsc_surface *surface, { struct wlsc_listener *l, *next; + wl_list_remove(&surface->link); + glDeleteTextures(1, &surface->texture); + wl_client_remove_surface(surface->base.client, &surface->base); + l = container_of(compositor->surface_destroy_listener_list.next, struct wlsc_listener, link); while (&l->link != &compositor->surface_destroy_listener_list) { @@ -377,9 +381,6 @@ wlsc_surface_destroy(struct wlsc_surface *surface, l = next; } - wl_list_remove(&surface->link); - - glDeleteTextures(1, &surface->texture); free(surface); } @@ -1037,15 +1038,20 @@ handle_surface_destroy(struct wlsc_listener *listener, { struct wlsc_input_device *device = container_of(listener, struct wlsc_input_device, listener); + struct wlsc_surface *focus; + int32_t sx, sy; if (device->grab_surface == surface) { device->grab_surface = NULL; device->grab = 0; } if (device->keyboard_focus == surface) - device->keyboard_focus = NULL; - if (device->pointer_focus == surface) - device->pointer_focus = NULL; + wlsc_input_device_set_keyboard_focus(device, NULL); + if (device->pointer_focus == surface) { + focus = pick_surface(device, &sx, &sy); + wlsc_input_device_set_pointer_focus(device, focus); + fprintf(stderr, "lost pointer focus surface, reverting to %p\n", focus); + } } static struct wlsc_input_device * |