[Spice-devel] [PATCH spice-gtk 2/5] inputs: add spice_inputs_key_press_and_release()
Marc-André Lureau
marcandre.lureau at gmail.com
Wed Aug 15 12:59:27 PDT 2012
If the server is capable of SPICE_INPUTS_CAP_SCANCODE, then we send
can send a single message with key press and release, to avoid
unwanted guest side key repeatition due to network jitter.
If the server is not capable, spice-gtk will use some compatibility
mode and send the existing DOWN and UP key events seperately.
---
doc/reference/spice-gtk-sections.txt | 1 +
gtk/channel-inputs.c | 37 ++++++++++++++++++++++++++++++++++
gtk/channel-inputs.h | 1 +
gtk/map-file | 1 +
4 files changed, 40 insertions(+)
diff --git a/doc/reference/spice-gtk-sections.txt b/doc/reference/spice-gtk-sections.txt
index daf575c..60e287a 100644
--- a/doc/reference/spice-gtk-sections.txt
+++ b/doc/reference/spice-gtk-sections.txt
@@ -203,6 +203,7 @@ spice_inputs_position
spice_inputs_button_press
spice_inputs_button_release
spice_inputs_key_press
+spice_inputs_key_press_and_release
spice_inputs_key_release
spice_inputs_set_key_locks
<SUBSECTION Standard>
diff --git a/gtk/channel-inputs.c b/gtk/channel-inputs.c
index 3259da8..0526738 100644
--- a/gtk/channel-inputs.c
+++ b/gtk/channel-inputs.c
@@ -514,6 +514,43 @@ void spice_inputs_key_release(SpiceInputsChannel *channel, guint scancode)
spice_msg_out_send(msg);
}
+/**
+ * spice_inputs_key_press_and_release:
+ * @channel:
+ * @scancode: a PC AT key scancode
+ *
+ * Press and release a key event atomically (in the same message).
+ *
+ * Since: 0.13
+ **/
+void spice_inputs_key_press_and_release(SpiceInputsChannel *input_channel, guint scancode)
+{
+ SpiceChannel *channel = SPICE_CHANNEL(input_channel);
+
+ g_return_if_fail(channel != NULL);
+ g_return_if_fail(channel->priv->state != SPICE_CHANNEL_STATE_UNCONNECTED);
+
+ if (channel->priv->state != SPICE_CHANNEL_STATE_READY)
+ return;
+ if (spice_channel_get_read_only(channel))
+ return;
+
+ if (spice_channel_test_capability(channel, SPICE_INPUTS_CAP_KEY_SCANCODE)) {
+ SpiceMsgOut *msg;
+ guint16 *code;
+
+ msg = spice_msg_out_new(channel, SPICE_MSGC_INPUTS_KEY_SCANCODE);
+ code = (guint16*)spice_marshaller_reserve_space(msg->marshaller, 2 * sizeof(guint16));
+ *code++ = spice_make_scancode(scancode, FALSE);
+ *code = spice_make_scancode(scancode, TRUE);
+ spice_msg_out_send(msg);
+ } else {
+ SPICE_DEBUG("The server doesn't support atomic press and release");
+ spice_inputs_key_press(input_channel, scancode);
+ spice_inputs_key_release(input_channel, scancode);
+ }
+}
+
/* main or coroutine context */
static SpiceMsgOut* set_key_locks(SpiceInputsChannel *channel, guint locks)
{
diff --git a/gtk/channel-inputs.h b/gtk/channel-inputs.h
index 9968b3b..3179a76 100644
--- a/gtk/channel-inputs.h
+++ b/gtk/channel-inputs.h
@@ -82,6 +82,7 @@ void spice_inputs_button_release(SpiceInputsChannel *channel, gint button,
void spice_inputs_key_press(SpiceInputsChannel *channel, guint scancode);
void spice_inputs_key_release(SpiceInputsChannel *channel, guint scancode);
void spice_inputs_set_key_locks(SpiceInputsChannel *channel, guint locks);
+void spice_inputs_key_press_and_release(SpiceInputsChannel *channel, guint scancode);
G_END_DECLS
diff --git a/gtk/map-file b/gtk/map-file
index 0d48bb3..ed2c07f 100644
--- a/gtk/map-file
+++ b/gtk/map-file
@@ -46,6 +46,7 @@ spice_inputs_button_press;
spice_inputs_button_release;
spice_inputs_channel_get_type;
spice_inputs_key_press;
+spice_inputs_key_press_and_release;
spice_inputs_key_release;
spice_inputs_lock_get_type;
spice_inputs_motion;
--
1.7.10.4
More information about the Spice-devel
mailing list