app: guarantee a ConfigEvent for every Window.Configure call

Not only is the client guaranteed a ConfigEvent, but app.Window
can assume that an unsupported decoration change will be corrected
(by a ConfigEvent with Decorated forced to the supported value).

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2022-06-25 13:57:46 +02:00
parent c5e07ba01f
commit 69e4a3cff3
8 changed files with 10 additions and 36 deletions
-2
View File
@@ -1329,9 +1329,7 @@ func (w *window) Configure(options []Option) {
if cnf.Decorated != prev.Decorated { if cnf.Decorated != prev.Decorated {
w.config.Decorated = cnf.Decorated w.config.Decorated = cnf.Decorated
} }
if w.config != prev {
w.callbacks.Event(ConfigEvent{Config: w.config}) w.callbacks.Event(ConfigEvent{Config: w.config})
}
}) })
} }
-2
View File
@@ -281,10 +281,8 @@ func (w *window) Configure([]Option) {
prev := w.config prev := w.config
// Decorations are never disabled. // Decorations are never disabled.
w.config.Decorated = true w.config.Decorated = true
if w.config != prev {
w.w.Event(ConfigEvent{Config: w.config}) w.w.Event(ConfigEvent{Config: w.config})
} }
}
func (w *window) EditorStateChanged(old, new editorState) {} func (w *window) EditorStateChanged(old, new editorState) {}
-2
View File
@@ -533,10 +533,8 @@ func (w *window) Configure(options []Option) {
if cnf.Decorated != prev.Decorated { if cnf.Decorated != prev.Decorated {
w.config.Decorated = cnf.Decorated w.config.Decorated = cnf.Decorated
} }
if w.config != prev {
w.w.Event(ConfigEvent{Config: w.config}) w.w.Event(ConfigEvent{Config: w.config})
} }
}
func (w *window) Perform(system.Action) {} func (w *window) Perform(system.Action) {}
-2
View File
@@ -390,10 +390,8 @@ func (w *window) Configure(options []Option) {
C.setWindowStandardButtonHidden(w.window, C.NSWindowMiniaturizeButton, barTrans) C.setWindowStandardButtonHidden(w.window, C.NSWindowMiniaturizeButton, barTrans)
C.setWindowStandardButtonHidden(w.window, C.NSWindowZoomButton, barTrans) C.setWindowStandardButtonHidden(w.window, C.NSWindowZoomButton, barTrans)
} }
if w.config != prev {
w.w.Event(ConfigEvent{Config: w.config}) w.w.Event(ConfigEvent{Config: w.config})
} }
}
func (w *window) setTitle(prev, cnf Config) { func (w *window) setTitle(prev, cnf Config) {
if prev.Title != cnf.Title { if prev.Title != cnf.Title {
-2
View File
@@ -1010,10 +1010,8 @@ func (w *window) Configure(options []Option) {
C.xdg_toplevel_set_max_size(w.topLvl, C.int32_t(scaled.X), C.int32_t(scaled.Y)) C.xdg_toplevel_set_max_size(w.topLvl, C.int32_t(scaled.X), C.int32_t(scaled.Y))
} }
} }
if w.config != prev || w.config.Decorated != cnf.Decorated {
w.w.Event(ConfigEvent{Config: w.config}) w.w.Event(ConfigEvent{Config: w.config})
} }
}
func (w *window) setTitle(prev, cnf Config) { func (w *window) setTitle(prev, cnf Config) {
if prev.Title != cnf.Title { if prev.Title != cnf.Title {
-9
View File
@@ -188,7 +188,6 @@ func createNativeWindow() (*window, error) {
// It reads the window style and size/position and updates w.config. // It reads the window style and size/position and updates w.config.
// If anything has changed it emits a ConfigEvent to notify the application. // If anything has changed it emits a ConfigEvent to notify the application.
func (w *window) update() { func (w *window) update() {
var triggerEvent bool
r := windows.GetWindowRect(w.hwnd) r := windows.GetWindowRect(w.hwnd)
size := image.Point{ size := image.Point{
X: int(r.Right - r.Left - w.deltas.width), X: int(r.Right - r.Left - w.deltas.width),
@@ -210,18 +209,10 @@ func (w *window) update() {
} else { } else {
mode = Windowed mode = Windowed
} }
if size != w.config.Size {
w.config.Size = size w.config.Size = size
triggerEvent = true
}
if mode != w.config.Mode {
w.config.Mode = mode w.config.Mode = mode
triggerEvent = true
}
if triggerEvent {
w.w.Event(ConfigEvent{Config: w.config}) w.w.Event(ConfigEvent{Config: w.config})
} }
}
func windowProc(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) uintptr { func windowProc(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) uintptr {
win, exists := winMap.Load(hwnd) win, exists := winMap.Load(hwnd)
-2
View File
@@ -234,10 +234,8 @@ func (w *x11Window) Configure(options []Option) {
if cnf.Decorated != prev.Decorated { if cnf.Decorated != prev.Decorated {
w.config.Decorated = cnf.Decorated w.config.Decorated = cnf.Decorated
} }
if w.config != prev {
w.w.Event(ConfigEvent{Config: w.config}) w.w.Event(ConfigEvent{Config: w.config})
} }
}
func (w *x11Window) setTitle(prev, cnf Config) { func (w *x11Window) setTitle(prev, cnf Config) {
if prev.Title != cnf.Title { if prev.Title != cnf.Title {
-5
View File
@@ -861,16 +861,11 @@ func (w *Window) processEvent(d driver, e event.Event) bool {
case wakeupEvent: case wakeupEvent:
select { select {
case opts := <-w.options: case opts := <-w.options:
// Send a decoration mode update, in case the driver does not
// support switching.
cnf := Config{Decorated: w.decorations.enabled} cnf := Config{Decorated: w.decorations.enabled}
for _, opt := range opts { for _, opt := range opts {
opt(w.metric, &cnf) opt(w.metric, &cnf)
} }
if w.decorations.enabled != cnf.Decorated {
w.decorations.enabled = cnf.Decorated w.decorations.enabled = cnf.Decorated
w.out <- ConfigEvent{Config: w.effectiveConfig()}
}
d.Configure(opts) d.Configure(opts)
default: default:
} }