qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefano Stabellini <stefano.stabellini@citrix.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] mouse click simple queue
Date: Mon, 28 Jan 2008 11:48:00 +0000	[thread overview]
Message-ID: <479DC0F0.5050205@citrix.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 292 bytes --]

Hi all,

qemu doesn't enqueue mouse events, just records the latest mouse state.
This can cause some lost mouse double clicks if the events are not 
processed fast enought.
I am attaching a patch that implements a simple queue for left mouse 
click events.

Best Regards,

Stefano Stabellini

[-- Attachment #2: mouseclick-queue.patch --]
[-- Type: text/x-patch, Size: 4342 bytes --]

Index: sdl.c
===================================================================
RCS file: /sources/qemu/qemu/sdl.c,v
retrieving revision 1.45
diff -r1.45 sdl.c
293c293
< static void sdl_send_mouse_event(int dz)
---
> static void sdl_send_mouse_event(int dx, int dy, int dz, int state)
295,297c295,296
<     int dx, dy, state, buttons;
<     state = SDL_GetRelativeMouseState(&dx, &dy);
<     buttons = 0;
---
>     int buttons = 0;
>     
314c313
< 	SDL_GetMouseState(&dx, &dy);
---
>         SDL_GetMouseState(&dx, &dy);
477c476,478
<                 sdl_send_mouse_event(0);
---
>                 int dx, dy, state;
>                 state = SDL_GetRelativeMouseState(&dx, &dy);
>                 sdl_send_mouse_event(dx, dy, 0, state);
480d480
<         case SDL_MOUSEBUTTONDOWN:
481a482,488
>             if (gui_grab || kbd_mouse_is_absolute()) {
>                 int dx, dy, state;
>                 state = SDL_GetRelativeMouseState(&dx, &dy);
>                 sdl_send_mouse_event(dx, dy, 0, state);
>             }
>             break;
>         case SDL_MOUSEBUTTONDOWN:
491c498
<                     int dz;
---
>                     int dx, dy, dz, state;
492a500
>                     state = SDL_GetRelativeMouseState(&dx, &dy);
494c502
<                     if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) {
---
>                     if (bev->button == SDL_BUTTON_WHEELUP) {
496c504,505
<                     } else if (bev->button == SDL_BUTTON_WHEELDOWN && ev->type == SDL_MOUSEBUTTONDOWN) {
---
>                     }
>                     else if (bev->button == SDL_BUTTON_WHEELDOWN) {
498a508,510
>                     else {
>                         state = bev->button | state;
>                     }
500c512
<                     sdl_send_mouse_event(dz);
---
>                     sdl_send_mouse_event(dx, dy, dz, state);
Index: hw/usb-hid.c
===================================================================
RCS file: /sources/qemu/qemu/hw/usb-hid.c,v
retrieving revision 1.16
diff -r1.16 usb-hid.c
386a387,395
> static int currentbutton = 0;
> typedef struct _mouseclick {
>     int button_state;
>     struct _mouseclick *next;
> } mouseclick; 
> static mouseclick mousequeue[20];
> static mouseclick *head = mousequeue;
> static mouseclick *tail = mousequeue;
> 
392a402,414
>     if (hs->changed == 1){
>         //A mouse event is lost
>         if (buttons_state != currentbutton && tail->next != head) {
>             //A left click event is lost: let's add it to the queue
>             //counter++;
>             tail->button_state = buttons_state;
>             tail = tail->next;
>         }
>     }
>     else {
>         s->buttons_state = buttons_state;
>     }
> 
396d417
<     s->buttons_state = buttons_state;
397a419
>     currentbutton = buttons_state;
405a428,440
>     if (hs->changed == 1){
>         //A mouse event is lost
>         if (buttons_state != currentbutton && tail->next != head) {
>             //A left click event is lost: let's add it to the queue
>             //counter++;
>             tail->button_state = buttons_state;
>             tail = tail->next;
>         }
>     }
>     else {
>         s->buttons_state = buttons_state;
>     }
> 
409d443
<     s->buttons_state = buttons_state;
410a445
>     currentbutton = buttons_state;
779c814
<             s->changed = 0;
---
> 
785a821,833
> 
>             if ((s->kind == USB_MOUSE || s->kind == USB_TABLET) && s->changed) {
>                 USBMouseState *ms = &s->ptr;
>                 if (head != tail) {
>                     ms->buttons_state = head->button_state;
>                     head = head->next;
>                 }
>                 else {
>                     s->changed = 0;
>                 }
>             } else {
>                 s->changed = 0;
>             }
810a859
>     int i;
812a862,868
>     for (i = 0; i < 19; i++) {
>         mousequeue[i].button_state = 0;
>         mousequeue[i].next = &(mousequeue[i + 1]);
>     }
>     mousequeue[i].button_state = 0;
>     mousequeue[i].next = mousequeue;
> 
833a890
>     int i;
835a893,899
>     for (i = 0; i < 19; i++) {
>         mousequeue[i].button_state = 0;
>         mousequeue[i].next = &(mousequeue[i + 1]);
>     }
>     mousequeue[i].button_state = 0;
>     mousequeue[i].next = mousequeue;
> 

             reply	other threads:[~2008-01-28 11:48 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-28 11:48 Stefano Stabellini [this message]
2008-01-28 11:59 ` [Qemu-devel] [PATCH] mouse click simple queue Stefano Stabellini
2008-01-28 12:24 ` Ronan Keryell
2008-01-28 12:31   ` Samuel Thibault
2008-01-28 15:08     ` Stefano Stabellini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=479DC0F0.5050205@citrix.com \
    --to=stefano.stabellini@citrix.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).