diff --git a/app/os_wayland.go b/app/os_wayland.go index 9d4cb285..159861a6 100644 --- a/app/os_wayland.go +++ b/app/os_wayland.go @@ -94,7 +94,10 @@ type wlDisplay struct { // Notification pipe fds. notify struct { - read, write int + read int + + mu sync.Mutex + write int } repeat repeatState @@ -1442,6 +1445,11 @@ func (w *window) SetAnimating(anim bool) { // Wakeup wakes up the event loop through the notification pipe. func (d *wlDisplay) wakeup() { oneByte := make([]byte, 1) + d.notify.mu.Lock() + defer d.notify.mu.Unlock() + if d.notify.write == 0 { + return + } if _, err := syscall.Write(d.notify.write, oneByte); err != nil && err != syscall.EAGAIN { panic(fmt.Errorf("failed to write to pipe: %v", err)) } @@ -1820,10 +1828,12 @@ func newWLDisplay() (*wlDisplay, error) { } func (d *wlDisplay) destroy() { + d.notify.mu.Lock() if d.notify.write != 0 { syscall.Close(d.notify.write) d.notify.write = 0 } + d.notify.mu.Unlock() if d.notify.read != 0 { syscall.Close(d.notify.read) d.notify.read = 0