summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2014-08-14 17:23:20 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2014-08-14 17:35:49 -0400
commitbda2d6d1ac764c5d41badf45c01e05730d3caa1f (patch)
tree1e53dcd590964f9062e20d256325da55d86c60ba
parent1e225ecdaf75db7db4ec75d99c483d7547740683 (diff)
downloadmutter-bda2d6d1ac764c5d41badf45c01e05730d3caa1f.tar.gz
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.
-rw-r--r--src/backends/x11/meta-backend-x11.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index 2d420cb05..14ba28c8b 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -63,6 +63,8 @@ struct _MetaBackendX11Private
uint8_t xkb_event_base;
uint8_t xkb_error_base;
+
+ struct xkb_keymap *keymap;
};
typedef struct _MetaBackendX11Private MetaBackendX11Private;
@@ -569,17 +571,18 @@ meta_backend_x11_get_keymap (MetaBackend *backend)
{
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
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);
- keymap = xkb_x11_keymap_new_from_device (context,
- priv->xcb,
- xkb_x11_get_core_keyboard_device_id (priv->xcb),
- XKB_KEYMAP_COMPILE_NO_FLAGS);
- xkb_context_unref (context);
+ if (priv->keymap == NULL)
+ {
+ struct xkb_context *context = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
+ priv->keymap = xkb_x11_keymap_new_from_device (context,
+ priv->xcb,
+ 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