[clutter/clutter-1.20] evdev: Update xkb state after input is resumed
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter/clutter-1.20] evdev: Update xkb state after input is resumed
- Date: Wed, 23 Jul 2014 12:30:45 +0000 (UTC)
commit 9e8c92d66a7dc0243f3a0a51ca46ca71c533a7d7
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Jul 21 23:48:42 2014 +0200
evdev: Update xkb state after input is resumed
xkb_state creation has been refactored out of clutter_evdev_set_keyboard_map(),
and used too in clutter_evdev_reclaim_devices(), so the xkb_state is fresh
clean after input is paused/resumed (and keyboard state possibly changed in
between)
https://bugzilla.gnome.org/show_bug.cgi?id=733562
clutter/evdev/clutter-device-manager-evdev.c | 73 ++++++++++++++++----------
1 files changed, 46 insertions(+), 27 deletions(-)
---
diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c
index eaacc3a..51e4550 100644
--- a/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/evdev/clutter-device-manager-evdev.c
@@ -121,6 +121,7 @@ struct _ClutterDeviceManagerEvdevPrivate
GSList *seats;
ClutterSeatEvdev *main_seat;
+ struct xkb_keymap *keymap;
ClutterPointerConstrainCallback constrain_callback;
gpointer constrain_data;
@@ -775,7 +776,7 @@ clutter_seat_evdev_new (ClutterDeviceManagerEvdev *manager_evdev)
seat->scroll_lock_led =
xkb_keymap_led_get_index (keymap, XKB_LED_NAME_SCROLL);
- xkb_keymap_unref (keymap);
+ priv->keymap = keymap;
}
seat->repeat = TRUE;
@@ -1515,6 +1516,9 @@ clutter_device_manager_evdev_finalize (GObject *object)
g_slist_free_full (priv->seats, (GDestroyNotify) clutter_seat_evdev_free);
g_slist_free (priv->devices);
+ if (priv->keymap)
+ xkb_keymap_unref (priv->keymap);
+
if (priv->event_source != NULL)
clutter_event_source_free (priv->event_source);
@@ -1687,6 +1691,42 @@ clutter_evdev_release_devices (void)
priv->released = TRUE;
}
+static void
+clutter_evdev_update_xkb_state (ClutterDeviceManagerEvdev *manager_evdev)
+{
+ ClutterDeviceManagerEvdevPrivate *priv;
+ GSList *iter;
+ ClutterSeatEvdev *seat;
+ xkb_mod_mask_t latched_mods;
+ xkb_mod_mask_t locked_mods;
+
+ priv = manager_evdev->priv;
+
+ for (iter = priv->seats; iter; iter = iter->next)
+ {
+ seat = iter->data;
+
+ latched_mods = xkb_state_serialize_mods (seat->xkb,
+ XKB_STATE_MODS_LATCHED);
+ locked_mods = xkb_state_serialize_mods (seat->xkb,
+ XKB_STATE_MODS_LOCKED);
+ xkb_state_unref (seat->xkb);
+ seat->xkb = xkb_state_new (priv->keymap);
+
+ xkb_state_update_mask (seat->xkb,
+ 0, /* depressed */
+ latched_mods,
+ locked_mods,
+ 0, 0, 0);
+
+ seat->caps_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_CAPS);
+ seat->num_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_NUM);
+ seat->scroll_lock_led = xkb_keymap_led_get_index (priv->keymap, XKB_LED_NAME_SCROLL);
+
+ clutter_seat_evdev_sync_leds (seat);
+ }
+}
+
/**
* clutter_evdev_reclaim_devices:
*
@@ -1717,6 +1757,7 @@ clutter_evdev_reclaim_devices (void)
}
libinput_resume (priv->libinput);
+ clutter_evdev_update_xkb_state (manager_evdev);
process_events (manager_evdev);
priv->released = FALSE;
@@ -1769,39 +1810,17 @@ clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev,
{
ClutterDeviceManagerEvdev *manager_evdev;
ClutterDeviceManagerEvdevPrivate *priv;
- GSList *iter;
- ClutterSeatEvdev *seat;
- xkb_mod_mask_t latched_mods;
- xkb_mod_mask_t locked_mods;
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
priv = manager_evdev->priv;
- for (iter = priv->seats; iter; iter = iter->next)
- {
- seat = iter->data;
-
- latched_mods = xkb_state_serialize_mods (seat->xkb,
- XKB_STATE_MODS_LATCHED);
- locked_mods = xkb_state_serialize_mods (seat->xkb,
- XKB_STATE_MODS_LOCKED);
- xkb_state_unref (seat->xkb);
- seat->xkb = xkb_state_new (keymap);
-
- xkb_state_update_mask (seat->xkb,
- 0, /* depressed */
- latched_mods,
- locked_mods,
- 0, 0, 0);
-
- seat->caps_lock_led = xkb_keymap_led_get_index (keymap, XKB_LED_NAME_CAPS);
- seat->num_lock_led = xkb_keymap_led_get_index (keymap, XKB_LED_NAME_NUM);
- seat->scroll_lock_led = xkb_keymap_led_get_index (keymap, XKB_LED_NAME_SCROLL);
+ if (priv->keymap)
+ xkb_keymap_unref (priv->keymap);
- clutter_seat_evdev_sync_leds (seat);
- }
+ priv->keymap = xkb_keymap_ref (keymap);
+ clutter_evdev_update_xkb_state (manager_evdev);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]