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
This commit is contained in:
Carlos Garnacho 2014-07-21 23:48:42 +02:00
parent 958ffd4d40
commit 9e8c92d66a

View File

@ -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;
if (priv->keymap)
xkb_keymap_unref (priv->keymap);
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);
clutter_seat_evdev_sync_leds (seat);
}
priv->keymap = xkb_keymap_ref (keymap);
clutter_evdev_update_xkb_state (manager_evdev);
}
/**