Message ID | 20151205133123.4f9f5035@holly |
---|---|
State | New |
Headers | show |
Copying maintainer. You can find people to copy by feeding your patch to scripts/get_maintainer.pl. Jindřich Makovička <makovick@gmail.com> 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?= <makovick@gmail.com> > 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 <makovick@gmail.com> > --- > 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,
Hi, For SDL2 this ... > > +static int idle_counter; ... should be store in ... > > void sdl2_poll_events(struct sdl2_console *scon) ... sdl2_console, otherwise it will not work as intended in case multiple windows are present. Otherwise looks fine to me. cheers, Gerd
From c747a56164a9d4289eae71c653431d8f6fd688e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20Makovi=C4=8Dka?= <makovick@gmail.com> 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 <makovick@gmail.com> --- 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, -- 2.6.2