input: Remove wl_seat global when a seat is destroyed
authorKristian Høgsberg <krh@bitplanet.net>
Mon, 8 Jul 2013 20:20:31 +0000 (16:20 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 8 Jul 2013 20:20:31 +0000 (16:20 -0400)
The input code was relying on compositor destruction to clean up the
global, but that doesn't work when the global comes and goes dynamically.

https://bugs.freedesktop.org/show_bug.cgi?id=65913

src/compositor.h
src/input.c

index 8070409..84f39e2 100644 (file)
@@ -437,6 +437,7 @@ struct weston_keyboard {
 struct weston_seat {
        struct wl_list base_resource_list;
 
+       struct wl_global *global;
        struct weston_pointer *pointer;
        struct weston_keyboard *keyboard;
        struct weston_touch *touch;
index a7a37e5..2519d9f 100644 (file)
@@ -1531,8 +1531,9 @@ weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec,
        wl_list_init(&seat->drag_resource_list);
        wl_signal_init(&seat->destroy_signal);
 
-       wl_display_add_global(ec->wl_display, &wl_seat_interface, seat,
-                             bind_seat);
+       seat->global =
+               wl_display_add_global(ec->wl_display,
+                                     &wl_seat_interface, seat, bind_seat);
 
        seat->compositor = ec;
        seat->modifier_state = 0;
@@ -1550,7 +1551,6 @@ WL_EXPORT void
 weston_seat_release(struct weston_seat *seat)
 {
        wl_list_remove(&seat->link);
-       /* The global object is destroyed at wl_display_destroy() time. */
 
 #ifdef ENABLE_XKBCOMMON
        if (seat->compositor->use_xkbcommon) {
@@ -1569,5 +1569,7 @@ weston_seat_release(struct weston_seat *seat)
 
        free (seat->seat_name);
 
+       wl_display_remove_global(seat->compositor->wl_display, seat->global);
+
        wl_signal_emit(&seat->destroy_signal, seat);
 }