vnc: Make ledstate comparison before modifiers updated

The ledstate should be compared before modifiers updated,
otherwise the ledstate would be the same as current_led_state.

Reported-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-id: 1368606040-11950-1-git-send-email-lilei@linux.vnet.ibm.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Lei Li 2013-05-15 16:20:40 +08:00 committed by Anthony Liguori
parent 800ced8cac
commit 1483adcf6a

View File

@ -1601,6 +1601,7 @@ static void kbd_leds(void *opaque, int ledstate)
{ {
VncState *vs = opaque; VncState *vs = opaque;
int caps, num, scr; int caps, num, scr;
bool has_changed = (ledstate != current_led_state(vs));
caps = ledstate & QEMU_CAPS_LOCK_LED ? 1 : 0; caps = ledstate & QEMU_CAPS_LOCK_LED ? 1 : 0;
num = ledstate & QEMU_NUM_LOCK_LED ? 1 : 0; num = ledstate & QEMU_NUM_LOCK_LED ? 1 : 0;
@ -1617,7 +1618,7 @@ static void kbd_leds(void *opaque, int ledstate)
} }
/* Sending the current led state message to the client */ /* Sending the current led state message to the client */
if (ledstate != current_led_state(vs)) { if (has_changed) {
vnc_led_state_change(vs); vnc_led_state_change(vs);
} }
} }