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