Skip to content

Commit

Permalink
empty! the GLMakie screen for reuse instead of closeing and reope…
Browse files Browse the repository at this point in the history
…ning

This fixes a problem observed on Linux (across at least a couple of
different desktop environments) with windows flashing away and coming
back in a different place (can be a different monitor!) when reusing the
shared singleton screen.

Also, wait for renderloop task to stop before restoring
`close_after_renderloop` value. Without this, one can observe that the
singleton window is fully closed and reopened by applying the following
patch:

```diff
diff --git a/GLMakie/src/screen.jl b/GLMakie/src/screen.jl
index ff8b69fdc..e18b8ba6b 100644
--- a/GLMakie/src/screen.jl
+++ b/GLMakie/src/screen.jl
@@ -839,6 +839,7 @@ function pause_renderloop!(screen::Screen)
 end

 function stop_renderloop!(screen::Screen; close_after_renderloop=screen.close_after_renderloop)
+    yield()
     # don't double close when stopping renderloop
     c = screen.close_after_renderloop
     screen.close_after_renderloop = close_after_renderloop
@@ -974,7 +975,7 @@ function renderloop(screen)
     end
     if screen.close_after_renderloop
         try
-            @debug("Closing screen after quiting renderloop!")
+            @info("Closing screen after quiting renderloop!")
             close(screen)
         catch e
             @warn "error closing screen" exception=(e, Base.catch_backtrace())
```
which aims to force the renderloop's task to run via the call to
`yield()` so that the task is sleeping during the rest of the function
call. (The logging change just makes the particular action easier to
find than enabling debug-level logging.)

Opening a plot and replotting at the REPL, I observe both the window
quickly close and reappear and the log message being printed by the end
of the renderloop:
```julia-repl
julia> using GLMakie
Precompiling GLMakie
        Info Given GLMakie was explicitly requested, output will be shown live
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
[ Info: Closing screen after quiting renderloop!
  1 dependency successfully precompiled in 21 seconds. 303 already precompiled.
  1 dependency had output during precompilation:
┌ GLMakie
│  [Output was shown above]
└

julia> scatter([1, 6])

julia> scatter([1, 6])
[ Info: Closing screen after quiting renderloop!

```

With the changes in this commit, all of the log message disappear,
including from the precompile process.
  • Loading branch information
jmert committed Sep 1, 2024
1 parent bdbed7c commit ec33d87
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions GLMakie/src/screen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,8 @@ function singleton_screen(debugging::Bool)
if !isempty(SINGLETON_SCREEN)
@debug("reusing singleton screen")
screen = SINGLETON_SCREEN[1]
close(screen; reuse=false)
stop_renderloop!(screen; close_after_renderloop=false)
empty!(screen)
else
@debug("new singleton screen")
# reuse=false, because we "manually" re-use the singleton screen!
Expand Down Expand Up @@ -885,8 +886,6 @@ function stop_renderloop!(screen::Screen; close_after_renderloop=screen.close_af
c = screen.close_after_renderloop
screen.close_after_renderloop = close_after_renderloop
screen.stop_renderloop = true
screen.close_after_renderloop = c

# stop_renderloop! may be called inside renderloop as part of close
# in which case we should not wait for the task to finish (deadlock)
if Base.current_task() != screen.rendertask
Expand All @@ -895,6 +894,7 @@ function stop_renderloop!(screen::Screen; close_after_renderloop=screen.close_af
screen.rendertask = nothing
end
# else, we can't do that much in the rendertask itself
screen.close_after_renderloop = c
return
end

Expand Down

0 comments on commit ec33d87

Please sign in to comment.