app/internal/window: block Main until all windows are closed

With this change, the Wayland backend now supports multiple windows.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-05-15 16:43:27 +02:00
parent cf72e684b6
commit 0181f22d01
3 changed files with 19 additions and 4 deletions
+8 -2
View File
@@ -8,10 +8,16 @@ import (
"errors" "errors"
) )
var mainDone = make(chan struct{}) // windowCounter keeps track of the number of windows.
// A send of +1 or -1 represents a change in window count.
var windowCounter = make(chan int)
func Main() { func Main() {
<-mainDone // Wait for first window
count := <-windowCounter
for count > 0 {
count += <-windowCounter
}
} }
// instead of creating files with build tags for each combination of wayland +/- x11 // instead of creating files with build tags for each combination of wayland +/- x11
+6 -1
View File
@@ -179,13 +179,18 @@ func newWLWindow(window Callbacks, opts *Options) error {
d.destroy() d.destroy()
return err return err
} }
// Increment window counter.
windowCounter <- +1
w.w = window w.w = window
go func() { go func() {
defer func() {
// Decrement window counter.
windowCounter <- -1
}()
w.w.SetDriver(w) w.w.SetDriver(w)
w.loop() w.loop()
w.destroy() w.destroy()
d.destroy() d.destroy()
close(mainDone)
}() }()
return nil return nil
} }
+5 -1
View File
@@ -422,12 +422,16 @@ func newX11Window(gioWin Callbacks, opts *Options) error {
// make the window visible on the screen // make the window visible on the screen
C.XMapWindow(dpy, win) C.XMapWindow(dpy, win)
// Increment window counter.
windowCounter <- +1
go func() { go func() {
defer func() {
windowCounter <- -1
}()
w.w.SetDriver(w) w.w.SetDriver(w)
w.setStage(system.StageRunning) w.setStage(system.StageRunning)
w.loop() w.loop()
w.destroy() w.destroy()
close(mainDone)
}() }()
return nil return nil
} }