summaryrefslogtreecommitdiffstats
path: root/server/inputs_channel.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-10-18 17:40:55 +0200
committerHans de Goede <hdegoede@redhat.com>2012-10-18 17:44:23 +0200
commitcb27e9dad6f25630b95dc7d9acffdb556aeff174 (patch)
tree5f565eefaf0992bd1e8e64f6d1bfb3120b6824b0 /server/inputs_channel.c
parenta179434aa9371a037a63858884f64b3cc06ff955 (diff)
downloadspice-cb27e9dad6f25630b95dc7d9acffdb556aeff174.tar.gz
spice-cb27e9dad6f25630b95dc7d9acffdb556aeff174.tar.xz
spice-cb27e9dad6f25630b95dc7d9acffdb556aeff174.zip
inputs_channel: Fix wrong handling of key up/down on big endian
The client will send 0x000000## codes for regular keys, and 0x0000##e0 codes for extended keys. The current code which simply walks the uint32_t code in memory order relies on the memory order being little endian, which will clearly fail on big endian machines, this fixes this. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'server/inputs_channel.c')
-rw-r--r--server/inputs_channel.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/server/inputs_channel.c b/server/inputs_channel.c
index bf5c22e9..1a64e2dd 100644
--- a/server/inputs_channel.c
+++ b/server/inputs_channel.c
@@ -309,6 +309,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
InputsChannel *inputs_channel = (InputsChannel *)rcc->channel;
InputsChannelClient *icc = (InputsChannelClient *)rcc;
uint8_t *buf = (uint8_t *)message;
+ uint32_t i;
spice_assert(g_inputs_channel == inputs_channel);
switch (type) {
@@ -321,15 +322,16 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
}
case SPICE_MSGC_INPUTS_KEY_UP: {
SpiceMsgcKeyDown *key_down = (SpiceMsgcKeyDown *)buf;
- uint8_t *now = (uint8_t *)&key_down->code;
- uint8_t *end = now + sizeof(key_down->code);
- for (; now < end && *now; now++) {
- kbd_push_scan(keyboard, *now);
+ for (i = 0; i < 4; i++) {
+ uint8_t code = (key_down->code >> (i * 8)) & 0xff;
+ if (code == 0) {
+ break;
+ }
+ kbd_push_scan(keyboard, code);
}
break;
}
case SPICE_MSGC_INPUTS_KEY_SCANCODE: {
- uint32_t i;
uint8_t *code = (uint8_t *)buf;
for (i = 0; i < size; i++) {
kbd_push_scan(keyboard, code[i]);