From 0181f22d0138eb8e346fee70726b3f8962bf644a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 15 May 2020 16:43:27 +0200 Subject: [PATCH] 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 --- app/internal/window/os_unix.go | 10 ++++++++-- app/internal/window/os_wayland.go | 7 ++++++- app/internal/window/os_x11.go | 6 +++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/internal/window/os_unix.go b/app/internal/window/os_unix.go index d32a03fb..76d6ce17 100644 --- a/app/internal/window/os_unix.go +++ b/app/internal/window/os_unix.go @@ -8,10 +8,16 @@ import ( "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() { - <-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 diff --git a/app/internal/window/os_wayland.go b/app/internal/window/os_wayland.go index 7adbc04d..4c854c1d 100644 --- a/app/internal/window/os_wayland.go +++ b/app/internal/window/os_wayland.go @@ -179,13 +179,18 @@ func newWLWindow(window Callbacks, opts *Options) error { d.destroy() return err } + // Increment window counter. + windowCounter <- +1 w.w = window go func() { + defer func() { + // Decrement window counter. + windowCounter <- -1 + }() w.w.SetDriver(w) w.loop() w.destroy() d.destroy() - close(mainDone) }() return nil } diff --git a/app/internal/window/os_x11.go b/app/internal/window/os_x11.go index 7189d042..d5674598 100644 --- a/app/internal/window/os_x11.go +++ b/app/internal/window/os_x11.go @@ -422,12 +422,16 @@ func newX11Window(gioWin Callbacks, opts *Options) error { // make the window visible on the screen C.XMapWindow(dpy, win) + // Increment window counter. + windowCounter <- +1 go func() { + defer func() { + windowCounter <- -1 + }() w.w.SetDriver(w) w.setStage(system.StageRunning) w.loop() w.destroy() - close(mainDone) }() return nil }