[Spice-devel] [PATCH spice-gtk 2/2] gtk-session: always sync modifiers for client events
Marc-André Lureau
marcandre.lureau at gmail.com
Fri Apr 4 03:47:26 PDT 2014
The channel state is not synchronous.
It may happen that we want to set and unset quickly a modifier, but the
guest modifier state hasn't been updated yet, and will still be seen as
unset, preventing the last unset change.
---
gtk/spice-gtk-session.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
index 922614d..9e74cbc 100644
--- a/gtk/spice-gtk-session.c
+++ b/gtk/spice-gtk-session.c
@@ -156,32 +156,35 @@ static guint32 get_keyboard_lock_modifiers(void)
}
static void spice_gtk_session_sync_keyboard_modifiers_for_channel(SpiceGtkSession *self,
- SpiceInputsChannel* inputs)
+ SpiceInputsChannel* inputs,
+ gboolean force)
{
gint guest_modifiers = 0, client_modifiers = 0;
g_return_if_fail(SPICE_IS_INPUTS_CHANNEL(inputs));
g_object_get(inputs, "key-modifiers", &guest_modifiers, NULL);
-
client_modifiers = get_keyboard_lock_modifiers();
- CHANNEL_DEBUG(inputs, "client_modifiers:0x%x, guest_modifiers:0x%x",
- client_modifiers, guest_modifiers);
- if (client_modifiers != guest_modifiers)
+ if (force || client_modifiers != guest_modifiers) {
+ CHANNEL_DEBUG(inputs, "client_modifiers:0x%x, guest_modifiers:0x%x",
+ client_modifiers, guest_modifiers);
spice_inputs_set_key_locks(inputs, client_modifiers);
+ }
}
static void keymap_modifiers_changed(GdkKeymap *keymap, gpointer data)
{
SpiceGtkSession *self = data;
+
spice_gtk_session_sync_keyboard_modifiers(self);
}
static void guest_modifiers_changed(SpiceInputsChannel *inputs, gpointer data)
{
SpiceGtkSession *self = data;
- spice_gtk_session_sync_keyboard_modifiers_for_channel(self, inputs);
+
+ spice_gtk_session_sync_keyboard_modifiers_for_channel(self, inputs, FALSE);
}
static void spice_gtk_session_init(SpiceGtkSession *self)
@@ -965,7 +968,7 @@ static void channel_new(SpiceSession *session, SpiceChannel *channel,
if (SPICE_IS_INPUTS_CHANNEL(channel)) {
spice_g_signal_connect_object(channel, "inputs-modifiers",
G_CALLBACK(guest_modifiers_changed), self, 0);
- spice_gtk_session_sync_keyboard_modifiers_for_channel(self, SPICE_INPUTS_CHANNEL(channel));
+ spice_gtk_session_sync_keyboard_modifiers_for_channel(self, SPICE_INPUTS_CHANNEL(channel), TRUE);
}
}
@@ -1132,7 +1135,7 @@ void spice_gtk_session_sync_keyboard_modifiers(SpiceGtkSession *self)
for (l = channels; l != NULL; l = l->next) {
if (SPICE_IS_INPUTS_CHANNEL(l->data)) {
SpiceInputsChannel *inputs = SPICE_INPUTS_CHANNEL(l->data);
- spice_gtk_session_sync_keyboard_modifiers_for_channel(self, inputs);
+ spice_gtk_session_sync_keyboard_modifiers_for_channel(self, inputs, TRUE);
}
}
}
--
1.8.5.3
More information about the Spice-devel
mailing list