app: update Window for macOS, X11 and Wayland

Commit #c4f98d3c1eab201419be255fafb139f7e10ad273 added
the Minimized and Maximized options for the Windows platform.
This change adds those for the remaining desktop platforms.

Signed-off-by: Pierre Curto <pierre.curto@gmail.com>
This commit is contained in:
Pierre Curto
2022-01-17 20:59:39 +01:00
committed by Elias Naur
parent 2ce9ad36af
commit b15a9cb595
5 changed files with 230 additions and 116 deletions
+66 -10
View File
@@ -190,6 +190,7 @@ type window struct {
// size is the unscaled window size (unlike config.Size which is scaled).
size image.Point
config Config
wsize image.Point // window config size before going fullscreen
wakeups chan struct{}
}
@@ -919,22 +920,77 @@ func (w *window) Configure(options []Option) {
prev := w.config
cnf := w.config
cnf.apply(cfg, options)
if prev.Size != cnf.Size {
w.size = image.Pt(cnf.Size.X/w.scale, cnf.Size.Y/w.scale)
w.config.Size = cnf.Size
}
if prev.Title != cnf.Title {
w.config.Title = cnf.Title
title := C.CString(cnf.Title)
C.xdg_toplevel_set_title(w.topLvl, title)
C.free(unsafe.Pointer(title))
switch cnf.Mode {
case Fullscreen:
switch prev.Mode {
case Minimized, Fullscreen:
default:
w.config.Mode = Fullscreen
w.wsize = w.config.Size
C.xdg_toplevel_set_fullscreen(w.topLvl, nil)
}
case Minimized:
switch prev.Mode {
case Minimized, Fullscreen:
default:
w.config.Mode = Minimized
C.xdg_toplevel_set_minimized(w.topLvl)
}
case Maximized:
switch prev.Mode {
case Minimized, Fullscreen:
default:
w.config.Mode = Maximized
w.wsize = w.config.Size
C.xdg_toplevel_set_maximized(w.topLvl)
}
case Windowed:
switch prev.Mode {
case Fullscreen:
w.config.Mode = Windowed
w.size = w.wsize.Div(w.scale)
C.xdg_toplevel_unset_fullscreen(w.topLvl)
case Minimized:
w.config.Mode = Windowed
w.config.Size = w.wsize
case Maximized:
w.config.Mode = Windowed
w.size = w.wsize.Div(w.scale)
C.xdg_toplevel_unset_maximized(w.topLvl)
}
w.setTitle(prev, cnf)
if prev.Size != cnf.Size {
w.config.Size = cnf.Size
w.size = cnf.Size.Div(w.scale)
}
if prev.MinSize != cnf.MinSize {
w.config.MinSize = cnf.MinSize
C.xdg_toplevel_set_min_size(w.topLvl, C.int32_t(cnf.MinSize.X), C.int32_t(cnf.MinSize.Y))
}
if prev.MaxSize != cnf.MaxSize {
w.config.MaxSize = cnf.MaxSize
C.xdg_toplevel_set_max_size(w.topLvl, C.int32_t(cnf.MaxSize.X), C.int32_t(cnf.MaxSize.Y))
}
}
if w.config != prev {
w.w.Event(ConfigEvent{Config: w.config})
}
}
func (w *window) Raise() {}
func (w *window) setTitle(prev, cnf Config) {
if prev.Title != cnf.Title {
w.config.Title = cnf.Title
title := C.CString(cnf.Title)
C.xdg_toplevel_set_title(w.topLvl, title)
C.free(unsafe.Pointer(title))
}
}
func (w *window) Raise() {
// NB. there is no way for a minimized window to be unminimized.
// https://wayland.app/protocols/xdg-shell#xdg_toplevel:request:set_minimized
}
func (w *window) SetCursor(name pointer.CursorName) {
ptr := w.disp.seat.pointer