summaryrefslogtreecommitdiff
path: root/gdk/wayland
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2013-03-23 18:02:28 -0400
committerMatthias Clasen <mclasen@redhat.com>2013-03-23 18:04:15 -0400
commit9182eacadfb6fc1f190997dfaf9e2fa456e9b212 (patch)
tree5c76eb5e536fbda7bfc58e743ec4376726aa8cca /gdk/wayland
parent0f59ff4550580d3b21b7a3bc0740a57c256c9768 (diff)
downloadgtk+-9182eacadfb6fc1f190997dfaf9e2fa456e9b212.tar.gz
wayland: Don't recreated keymaps on layout change
The GDK model for keymaps expects the keymap object to stay around and emit a ::keys-changed signal. So, do that. This should make layout changes work, but it remains untested since weston does not support layout changes at runtime. At the same time, plug a memory leak where GdkWaylandKeymap forgot to free its xkb objects in finalize. https://bugzilla.gnome.org/show_bug.cgi?id=696339
Diffstat (limited to 'gdk/wayland')
-rw-r--r--gdk/wayland/gdkdevice-wayland.c7
-rw-r--r--gdk/wayland/gdkkeys-wayland.c34
-rw-r--r--gdk/wayland/gdkprivate-wayland.h6
3 files changed, 29 insertions, 18 deletions
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index 91056aeaf0..800229cf0e 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -777,10 +777,11 @@ keyboard_handle_keymap (void *data,
uint32_t size)
{
GdkWaylandDeviceData *device = data;
- if (device->keymap)
- g_object_unref (device->keymap);
- device->keymap = _gdk_wayland_keymap_new_from_fd (format, fd, size);
+ _gdk_wayland_keymap_update_from_fd (device->keymap, format, fd, size);
+
+ g_signal_emit_by_name (device->keymap, "keys-changed");
+ g_signal_emit_by_name (device->keymap, "state-changed");
}
static void
diff --git a/gdk/wayland/gdkkeys-wayland.c b/gdk/wayland/gdkkeys-wayland.c
index 4d10e67946..c2d07eb2a5 100644
--- a/gdk/wayland/gdkkeys-wayland.c
+++ b/gdk/wayland/gdkkeys-wayland.c
@@ -66,6 +66,11 @@ G_DEFINE_TYPE (GdkWaylandKeymap, _gdk_wayland_keymap, GDK_TYPE_KEYMAP)
static void
gdk_wayland_keymap_finalize (GObject *object)
{
+ GdkWaylandKeymap *keymap = GDK_WAYLAND_KEYMAP (object);
+
+ xkb_keymap_unref (keymap->xkb_keymap);
+ xkb_state_unref (keymap->xkb_state);
+
G_OBJECT_CLASS (_gdk_wayland_keymap_parent_class)->finalize (object);
}
@@ -228,31 +233,34 @@ _gdk_wayland_keymap_new ()
return GDK_KEYMAP (keymap);
}
-GdkKeymap *
-_gdk_wayland_keymap_new_from_fd (uint32_t format,
- uint32_t fd, uint32_t size)
+void
+_gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap,
+ uint32_t format,
+ uint32_t fd,
+ uint32_t size)
{
- GdkWaylandKeymap *keymap;
+ GdkWaylandKeymap *keymap_wayland = GDK_WAYLAND_KEYMAP (keymap);
struct xkb_context *context;
char *map_str;
- keymap = g_object_new (_gdk_wayland_keymap_get_type(), NULL);
-
context = xkb_context_new (0);
map_str = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
- if (map_str == MAP_FAILED) {
- close(fd);
- return NULL;
+ if (map_str == MAP_FAILED)
+ {
+ close(fd);
+ return;
}
- keymap->xkb_keymap = xkb_keymap_new_from_string (context, map_str, format, 0);
+ xkb_keymap_unref (keymap_wayland->xkb_keymap);
+ keymap_wayland->xkb_keymap = xkb_keymap_new_from_string (context, map_str, format, 0);
munmap (map_str, size);
close (fd);
- keymap->xkb_state = xkb_state_new (keymap->xkb_keymap);
- xkb_context_unref (context);
- return GDK_KEYMAP (keymap);
+ xkb_state_unref (keymap_wayland->xkb_state);
+ keymap_wayland->xkb_state = xkb_state_new (keymap_wayland->xkb_keymap);
+
+ xkb_context_unref (context);
}
struct xkb_keymap *_gdk_wayland_keymap_get_xkb_keymap (GdkKeymap *keymap)
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 0b7f5b570f..9c958e4470 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -49,8 +49,10 @@ void _gdk_wayland_window_add_focus (GdkWindow *window);
void _gdk_wayland_window_remove_focus (GdkWindow *window);
GdkKeymap *_gdk_wayland_keymap_new (void);
-GdkKeymap *_gdk_wayland_keymap_new_from_fd (uint32_t format,
- uint32_t fd, uint32_t size);
+void _gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap,
+ uint32_t format,
+ uint32_t fd,
+ uint32_t size);
struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap);
struct xkb_keymap *_gdk_wayland_keymap_get_xkb_keymap (GdkKeymap *keymap);