A simpler fix would be to not call xkb_info_destroy() when releasing a seat in 
the case where the xkb_info for the seat was copied from the global compositor 
settings (which can be determined by checking if keymap_fd is the same)

In this case, xkb_map_unref() should still be called to unref the keymap.

This appears to fix things for me, so I can now create and destroy many seats.

---
 src/input.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/input.c b/src/input.c
index 325a48f..d99798e 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1600,7 +1600,12 @@ weston_seat_release(struct weston_seat *seat)
        if (seat->compositor->use_xkbcommon) {
                if (seat->xkb_state.state != NULL)
                        xkb_state_unref(seat->xkb_state.state);
-               xkb_info_destroy(&seat->xkb_info);
+
+               if (seat->xkb_info.keymap_fd != 
+                   seat->compositor->xkb_info.keymap_fd)
+                       xkb_info_destroy(&seat->xkb_info);
+               else if (seat->xkb_info.keymap)
+                       xkb_map_unref(seat->xkb_info.keymap);
        }
 #endif
 
-- 
1.7.10.4
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to