qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] sdl: shorten the GUI refresh interval when mous


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH] sdl: shorten the GUI refresh interval when mouse or keyboard is active
Date: Mon, 11 Jan 2016 13:32:33 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Copying maintainer.  You can find people to copy by feeding your patch
to scripts/get_maintainer.pl.

Jindřich Makovička <address@hidden> writes:

> Hi,
>
> some years ago, I submitted a patch improving the mouse response in SDL
> ui, but it got lost under the sands of time. Here is an updated version
> for both SDL and SDL2 frontends.
>
> With the change applied, when the gui receives a keyboard or mouse
> event, it shortens the gui refresh interval to 10ms instead of 30ms for
> next ~60ms. This results in a much better experience when using a mouse
> - similar to the "real" desktop.
>
> Please Cc:, I am not a subscriber.
>
> Regards,
> -- 
> Jindrich Makovicka
>
> From c747a56164a9d4289eae71c653431d8f6fd688e0 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Jind=C5=99ich=20Makovi=C4=8Dka?= <address@hidden>
> Date: Sat, 5 Dec 2015 13:28:22 +0100
> Subject: [PATCH] sdl: shorten the GUI refresh interval when mouse or keyboard
>  is active
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> Signed-off-by: Jindřich Makovička <address@hidden>
> ---
>  ui/sdl.c  | 22 ++++++++++++++++++++++
>  ui/sdl2.c | 24 ++++++++++++++++++++++++
>  2 files changed, 46 insertions(+)
>
> diff --git a/ui/sdl.c b/ui/sdl.c
> index 570cb99..aef237a 100644
> --- a/ui/sdl.c
> +++ b/ui/sdl.c
> @@ -60,6 +60,11 @@ static SDL_Cursor *guest_sprite = NULL;
>  static SDL_PixelFormat host_format;
>  static int scaling_active = 0;
>  static Notifier mouse_mode_notifier;
> +static int idle_counter;
> +
> +#define SDL_REFRESH_INTERVAL_BUSY 10
> +#define SDL_MAX_IDLE_COUNT (2 * GUI_REFRESH_INTERVAL_DEFAULT \
> +                            / SDL_REFRESH_INTERVAL_BUSY + 1)
>  
>  #if 0
>  #define DEBUG_SDL
> @@ -802,6 +807,7 @@ static void handle_activation(SDL_Event *ev)
>  static void sdl_refresh(DisplayChangeListener *dcl)
>  {
>      SDL_Event ev1, *ev = &ev1;
> +    int idle = 1;
>  
>      if (last_vm_running != runstate_is_running()) {
>          last_vm_running = runstate_is_running();
> @@ -817,9 +823,11 @@ static void sdl_refresh(DisplayChangeListener *dcl)
>              sdl_update(dcl, 0, 0, real_screen->w, real_screen->h);
>              break;
>          case SDL_KEYDOWN:
> +            idle = 0;
>              handle_keydown(ev);
>              break;
>          case SDL_KEYUP:
> +            idle = 0;
>              handle_keyup(ev);
>              break;
>          case SDL_QUIT:
> @@ -829,10 +837,12 @@ static void sdl_refresh(DisplayChangeListener *dcl)
>              }
>              break;
>          case SDL_MOUSEMOTION:
> +            idle = 0;
>              handle_mousemotion(ev);
>              break;
>          case SDL_MOUSEBUTTONDOWN:
>          case SDL_MOUSEBUTTONUP:
> +            idle = 0;
>              handle_mousebutton(ev);
>              break;
>          case SDL_ACTIVEEVENT:
> @@ -847,6 +857,18 @@ static void sdl_refresh(DisplayChangeListener *dcl)
>              break;
>          }
>      }
> +
> +    if (idle) {
> +        if (idle_counter < SDL_MAX_IDLE_COUNT) {
> +            idle_counter++;
> +            if (idle_counter >= SDL_MAX_IDLE_COUNT) {
> +                dcl->update_interval = GUI_REFRESH_INTERVAL_DEFAULT;
> +            }
> +        }
> +    } else {
> +        idle_counter = 0;
> +        dcl->update_interval = SDL_REFRESH_INTERVAL_BUSY;
> +    }
>  }
>  
>  static void sdl_mouse_warp(DisplayChangeListener *dcl,
> diff --git a/ui/sdl2.c b/ui/sdl2.c
> index 5cb75aa..8f0fceb 100644
> --- a/ui/sdl2.c
> +++ b/ui/sdl2.c
> @@ -48,6 +48,11 @@ static int guest_cursor;
>  static int guest_x, guest_y;
>  static SDL_Cursor *guest_sprite;
>  static Notifier mouse_mode_notifier;
> +static int idle_counter;
> +
> +#define SDL2_REFRESH_INTERVAL_BUSY 10
> +#define SDL2_MAX_IDLE_COUNT (2 * GUI_REFRESH_INTERVAL_DEFAULT \
> +                             / SDL2_REFRESH_INTERVAL_BUSY + 1)
>  
>  static void sdl_update_caption(struct sdl2_console *scon);
>  
> @@ -578,6 +583,7 @@ static void handle_windowevent(SDL_Event *ev)
>  void sdl2_poll_events(struct sdl2_console *scon)
>  {
>      SDL_Event ev1, *ev = &ev1;
> +    int idle = 1;
>  
>      if (scon->last_vm_running != runstate_is_running()) {
>          scon->last_vm_running = runstate_is_running();
> @@ -587,12 +593,15 @@ void sdl2_poll_events(struct sdl2_console *scon)
>      while (SDL_PollEvent(ev)) {
>          switch (ev->type) {
>          case SDL_KEYDOWN:
> +            idle = 0;
>              handle_keydown(ev);
>              break;
>          case SDL_KEYUP:
> +            idle = 0;
>              handle_keyup(ev);
>              break;
>          case SDL_TEXTINPUT:
> +            idle = 0;
>              handle_textinput(ev);
>              break;
>          case SDL_QUIT:
> @@ -602,13 +611,16 @@ void sdl2_poll_events(struct sdl2_console *scon)
>              }
>              break;
>          case SDL_MOUSEMOTION:
> +            idle = 0;
>              handle_mousemotion(ev);
>              break;
>          case SDL_MOUSEBUTTONDOWN:
>          case SDL_MOUSEBUTTONUP:
> +            idle = 0;
>              handle_mousebutton(ev);
>              break;
>          case SDL_MOUSEWHEEL:
> +            idle = 0;
>              handle_mousewheel(ev);
>              break;
>          case SDL_WINDOWEVENT:
> @@ -618,6 +630,18 @@ void sdl2_poll_events(struct sdl2_console *scon)
>              break;
>          }
>      }
> +
> +    if (idle) {
> +        if (idle_counter < SDL2_MAX_IDLE_COUNT) {
> +            idle_counter++;
> +            if (idle_counter >= SDL2_MAX_IDLE_COUNT) {
> +                scon->dcl.update_interval = GUI_REFRESH_INTERVAL_DEFAULT;
> +            }
> +        }
> +    } else {
> +        idle_counter = 0;
> +        scon->dcl.update_interval = SDL2_REFRESH_INTERVAL_BUSY;
> +    }
>  }
>  
>  static void sdl_mouse_warp(DisplayChangeListener *dcl,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]