Fix cursor blinking problem

The problem was that when the editor had no events the cursor was not
blinking because the event loop was blocking on wait_event.

Now we no longer calls wait_event without a timeout if the windows has
the focus. When the window has the focus the timeout is set to 1 / fps
so that the cursor can blinks.

In addition we react to the "focus lost" event to ensure the documents
are redrawn without the cursor.
This commit is contained in:
Francesco Abbate 2020-11-21 16:36:13 +01:00
parent bdaddea29a
commit 70412b520b
3 changed files with 17 additions and 1 deletions

View File

@ -378,6 +378,8 @@ function core.on_event(type, ...)
core.root_view:open_doc(doc)
end
end
elseif type == "focuslost" then
core.root_view:on_focus_lost(...)
elseif type == "quit" then
core.quit()
end
@ -487,7 +489,12 @@ function core.run()
-- do not wait of events at idle_iterations = 1 to give a chance at core.step to run
-- and set "redraw" flag.
if idle_iterations > 1 then
system.wait_event()
if system.window_has_focus() then
-- keep running even with no events to make the cursor blinks
system.wait_event(1 / config.fps)
else
system.wait_event()
end
end
else
idle_iterations = 0

View File

@ -504,6 +504,11 @@ function RootView:on_text_input(...)
end
function RootView:on_focus_lost(...)
-- We force a redraw so documents can redraw without the cursor.
core.redraw = true
end
function RootView:update()
copy_position_and_size(self.root_node, self)
self.root_node:update()

View File

@ -61,6 +61,10 @@ top:
lua_pushstring(L, "exposed");
return 1;
}
if (e.window.event == SDL_WINDOWEVENT_FOCUS_LOST) {
lua_pushstring(L, "focuslost");
return 1;
}
/* on some systems, when alt-tabbing to the window SDL will queue up
** several KEYDOWN events for the `tab` key; we flush all keydown
** events on focus so these are discarded */