clients/window: Dispose of previous keymap and state on keymap change
authorRui Matos <tiagomatos@gmail.com>
Thu, 10 Oct 2013 17:44:22 +0000 (19:44 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 22 Oct 2013 22:25:04 +0000 (15:25 -0700)
clients/window.c

index 506357f..b8651b6 100644 (file)
@@ -2774,6 +2774,8 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
                       uint32_t format, int fd, uint32_t size)
 {
        struct input *input = data;
+       struct xkb_keymap *keymap;
+       struct xkb_state *state;
        char *map_str;
 
        if (!data) {
@@ -2792,26 +2794,30 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
                return;
        }
 
-       input->xkb.keymap = xkb_map_new_from_string(input->display->xkb_context,
-                                                   map_str,
-                                                   XKB_KEYMAP_FORMAT_TEXT_V1,
-                                                   0);
+       keymap = xkb_map_new_from_string(input->display->xkb_context,
+                                        map_str,
+                                        XKB_KEYMAP_FORMAT_TEXT_V1,
+                                        0);
        munmap(map_str, size);
        close(fd);
 
-       if (!input->xkb.keymap) {
+       if (!keymap) {
                fprintf(stderr, "failed to compile keymap\n");
                return;
        }
 
-       input->xkb.state = xkb_state_new(input->xkb.keymap);
-       if (!input->xkb.state) {
+       state = xkb_state_new(keymap);
+       if (!state) {
                fprintf(stderr, "failed to create XKB state\n");
-               xkb_map_unref(input->xkb.keymap);
-               input->xkb.keymap = NULL;
+               xkb_map_unref(keymap);
                return;
        }
 
+       xkb_keymap_unref(input->xkb.keymap);
+       xkb_state_unref(input->xkb.state);
+       input->xkb.keymap = keymap;
+       input->xkb.state = state;
+
        input->xkb.control_mask =
                1 << xkb_map_mod_get_index(input->xkb.keymap, "Control");
        input->xkb.alt_mask =