From 70412b520b2fdba84574206ba4fce69bb50e9eea Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Sat, 21 Nov 2020 16:36:13 +0100 Subject: [PATCH] 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. --- data/core/init.lua | 9 ++++++++- data/core/rootview.lua | 5 +++++ src/api/system.c | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/data/core/init.lua b/data/core/init.lua index 5d023055..60d01f57 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -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 diff --git a/data/core/rootview.lua b/data/core/rootview.lua index 8bcc03da..51150079 100644 --- a/data/core/rootview.lua +++ b/data/core/rootview.lua @@ -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() diff --git a/src/api/system.c b/src/api/system.c index 0028f290..c7243442 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -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 */