Skip to content

Commit

Permalink
msmouse: send short messages if possible.
Browse files Browse the repository at this point in the history
Keep track of button changes.  Send the extended 4-byte messages for
three button mice only in case we have something to report for the
middle button.  Use the short 3-byte messages (original protocol for
two-button microsoft mouse) otherwise.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 1467625375-31774-5-git-send-email-kraxel@redhat.com
  • Loading branch information
kraxel committed Jul 12, 2016
1 parent 96d7c07 commit d7b7f52
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions backends/msmouse.c
Expand Up @@ -35,6 +35,7 @@ typedef struct {
QemuInputHandlerState *hs;
int axis[INPUT_AXIS__MAX];
bool btns[INPUT_BUTTON__MAX];
bool btnc[INPUT_BUTTON__MAX];
uint8_t outbuf[32];
int outlen;
} MouseState;
Expand Down Expand Up @@ -62,7 +63,7 @@ static void msmouse_chr_accept_input(CharDriverState *chr)
static void msmouse_queue_event(MouseState *mouse)
{
unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 };
int dx, dy;
int dx, dy, count = 3;

dx = mouse->axis[INPUT_AXIS_X];
mouse->axis[INPUT_AXIS_X] = 0;
Expand All @@ -78,14 +79,16 @@ static void msmouse_queue_event(MouseState *mouse)
/* Buttons */
bytes[0] |= (mouse->btns[INPUT_BUTTON_LEFT] ? 0x20 : 0x00);
bytes[0] |= (mouse->btns[INPUT_BUTTON_RIGHT] ? 0x10 : 0x00);
bytes[3] |= (mouse->btns[INPUT_BUTTON_MIDDLE] ? 0x20 : 0x00);

if (mouse->outlen <= sizeof(mouse->outbuf) - 4) {
/* We always send the packet of, so that we do not have to keep track
of previous state of the middle button. This can potentially confuse
some very old drivers for two button mice though. */
memcpy(mouse->outbuf + mouse->outlen, bytes, 4);
mouse->outlen += 4;
if (mouse->btns[INPUT_BUTTON_MIDDLE] ||
mouse->btnc[INPUT_BUTTON_MIDDLE]) {
bytes[3] |= (mouse->btns[INPUT_BUTTON_MIDDLE] ? 0x20 : 0x00);
mouse->btnc[INPUT_BUTTON_MIDDLE] = false;
count = 4;
}

if (mouse->outlen <= sizeof(mouse->outbuf) - count) {
memcpy(mouse->outbuf + mouse->outlen, bytes, count);
mouse->outlen += count;
} else {
/* queue full -> drop event */
}
Expand All @@ -107,6 +110,7 @@ static void msmouse_input_event(DeviceState *dev, QemuConsole *src,
case INPUT_EVENT_KIND_BTN:
btn = evt->u.btn.data;
mouse->btns[btn->button] = btn->down;
mouse->btnc[btn->button] = true;
break;

default:
Expand Down

0 comments on commit d7b7f52

Please sign in to comment.