st: Use ClutterKeymap to detect caps lock state changes

This drops usage of Gtk/X11, replacing it with code that is dependent
of the Clutter backend in use. Another positive side effect is that
the keymap state will now be correct on wayland, since there were no
guarantees that X11 key state would reflect the current reality.

https://bugzilla.gnome.org/show_bug.cgi?id=762881
This commit is contained in:
Carlos Garnacho 2019-01-10 23:19:17 +01:00 committed by Carlos Garnacho
parent 36b9f45368
commit 95a31b0c31

View File

@ -239,7 +239,7 @@ remove_capslock_feedback (StEntry *entry)
} }
static void static void
keymap_state_changed (GdkKeymap *keymap, keymap_state_changed (ClutterKeymap *keymap,
gpointer user_data) gpointer user_data)
{ {
StEntry *entry = ST_ENTRY (user_data); StEntry *entry = ST_ENTRY (user_data);
@ -247,7 +247,7 @@ keymap_state_changed (GdkKeymap *keymap,
if (clutter_text_get_password_char (CLUTTER_TEXT (priv->entry)) != 0) if (clutter_text_get_password_char (CLUTTER_TEXT (priv->entry)) != 0)
{ {
if (gdk_keymap_get_caps_lock_state (keymap)) if (clutter_keymap_get_caps_lock_state (keymap))
show_capslock_feedback (entry); show_capslock_feedback (entry);
else else
remove_capslock_feedback (entry); remove_capslock_feedback (entry);
@ -259,11 +259,11 @@ st_entry_dispose (GObject *object)
{ {
StEntry *entry = ST_ENTRY (object); StEntry *entry = ST_ENTRY (object);
StEntryPrivate *priv = ST_ENTRY_PRIV (entry); StEntryPrivate *priv = ST_ENTRY_PRIV (entry);
GdkKeymap *keymap; ClutterKeymap *keymap;
cogl_clear_object (&priv->text_shadow_material); cogl_clear_object (&priv->text_shadow_material);
keymap = gdk_keymap_get_for_display (gdk_display_get_default ()); keymap = clutter_backend_get_keymap (clutter_get_default_backend ());
g_signal_handlers_disconnect_by_func (keymap, keymap_state_changed, entry); g_signal_handlers_disconnect_by_func (keymap, keymap_state_changed, entry);
G_OBJECT_CLASS (st_entry_parent_class)->dispose (object); G_OBJECT_CLASS (st_entry_parent_class)->dispose (object);
@ -563,11 +563,11 @@ clutter_text_focus_in_cb (ClutterText *text,
ClutterActor *actor) ClutterActor *actor)
{ {
StEntry *entry = ST_ENTRY (actor); StEntry *entry = ST_ENTRY (actor);
GdkKeymap *keymap; ClutterKeymap *keymap;
st_entry_update_hint_visibility (entry); st_entry_update_hint_visibility (entry);
keymap = gdk_keymap_get_for_display (gdk_display_get_default ()); keymap = clutter_backend_get_keymap (clutter_get_default_backend ());
keymap_state_changed (keymap, entry); keymap_state_changed (keymap, entry);
g_signal_connect (keymap, "state-changed", g_signal_connect (keymap, "state-changed",
G_CALLBACK (keymap_state_changed), entry); G_CALLBACK (keymap_state_changed), entry);
@ -581,7 +581,7 @@ clutter_text_focus_out_cb (ClutterText *text,
ClutterActor *actor) ClutterActor *actor)
{ {
StEntry *entry = ST_ENTRY (actor); StEntry *entry = ST_ENTRY (actor);
GdkKeymap *keymap; ClutterKeymap *keymap;
st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus"); st_widget_remove_style_pseudo_class (ST_WIDGET (actor), "focus");
@ -590,7 +590,7 @@ clutter_text_focus_out_cb (ClutterText *text,
clutter_text_set_cursor_visible (text, FALSE); clutter_text_set_cursor_visible (text, FALSE);
remove_capslock_feedback (entry); remove_capslock_feedback (entry);
keymap = gdk_keymap_get_for_display (gdk_display_get_default ()); keymap = clutter_backend_get_keymap (clutter_get_default_backend ());
g_signal_handlers_disconnect_by_func (keymap, keymap_state_changed, entry); g_signal_handlers_disconnect_by_func (keymap, keymap_state_changed, entry);
} }