backend-x11: Don't leak the keymap

meta_backend_get_keymap is supposed to return a static keymap, not a new
one every time. Cache it internally. We don't update it when the keymap
changes on the server, but we'll do this soon.
This commit is contained in:
Jasper St. Pierre 2014-08-14 17:23:20 -04:00
parent 1e225ecdaf
commit bda2d6d1ac

View File

@ -63,6 +63,8 @@ struct _MetaBackendX11Private
uint8_t xkb_event_base; uint8_t xkb_event_base;
uint8_t xkb_error_base; uint8_t xkb_error_base;
struct xkb_keymap *keymap;
}; };
typedef struct _MetaBackendX11Private MetaBackendX11Private; typedef struct _MetaBackendX11Private MetaBackendX11Private;
@ -569,17 +571,18 @@ meta_backend_x11_get_keymap (MetaBackend *backend)
{ {
MetaBackendX11 *x11 = META_BACKEND_X11 (backend); MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
struct xkb_keymap *keymap;
struct xkb_context *context;
context = xkb_context_new (XKB_CONTEXT_NO_FLAGS); if (priv->keymap == NULL)
keymap = xkb_x11_keymap_new_from_device (context, {
priv->xcb, struct xkb_context *context = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
xkb_x11_get_core_keyboard_device_id (priv->xcb), priv->keymap = xkb_x11_keymap_new_from_device (context,
XKB_KEYMAP_COMPILE_NO_FLAGS); priv->xcb,
xkb_context_unref (context); xkb_x11_get_core_keyboard_device_id (priv->xcb),
XKB_KEYMAP_COMPILE_NO_FLAGS);
xkb_context_unref (context);
}
return keymap; return priv->keymap;
} }
static void static void