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; GSList *seats;
ClutterSeatEvdev *main_seat; ClutterSeatEvdev *main_seat;
struct xkb_keymap *keymap;
ClutterPointerConstrainCallback constrain_callback; ClutterPointerConstrainCallback constrain_callback;
gpointer constrain_data; gpointer constrain_data;
@ -775,7 +776,7 @@ clutter_seat_evdev_new (ClutterDeviceManagerEvdev *manager_evdev)
seat->scroll_lock_led = seat->scroll_lock_led =
xkb_keymap_led_get_index (keymap, XKB_LED_NAME_SCROLL); xkb_keymap_led_get_index (keymap, XKB_LED_NAME_SCROLL);
xkb_keymap_unref (keymap); priv->keymap = keymap;
} }
seat->repeat = TRUE; 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_full (priv->seats, (GDestroyNotify) clutter_seat_evdev_free);
g_slist_free (priv->devices); g_slist_free (priv->devices);
if (priv->keymap)
xkb_keymap_unref (priv->keymap);
if (priv->event_source != NULL) if (priv->event_source != NULL)
clutter_event_source_free (priv->event_source); clutter_event_source_free (priv->event_source);
@ -1687,6 +1691,42 @@ clutter_evdev_release_devices (void)
priv->released = TRUE; 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: * clutter_evdev_reclaim_devices:
* *
@ -1717,6 +1757,7 @@ clutter_evdev_reclaim_devices (void)
} }
libinput_resume (priv->libinput); libinput_resume (priv->libinput);
clutter_evdev_update_xkb_state (manager_evdev);
process_events (manager_evdev); process_events (manager_evdev);
priv->released = FALSE; priv->released = FALSE;
@ -1769,39 +1810,17 @@ clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev,
{ {
ClutterDeviceManagerEvdev *manager_evdev; ClutterDeviceManagerEvdev *manager_evdev;
ClutterDeviceManagerEvdevPrivate *priv; 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)); g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev); manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
priv = manager_evdev->priv; priv = manager_evdev->priv;
for (iter = priv->seats; iter; iter = iter->next) if (priv->keymap)
{ xkb_keymap_unref (priv->keymap);
seat = iter->data;
latched_mods = xkb_state_serialize_mods (seat->xkb, priv->keymap = xkb_keymap_ref (keymap);
XKB_STATE_MODS_LATCHED); clutter_evdev_update_xkb_state (manager_evdev);
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);
}
} }
/** /**