widget/material: add hover state to window decorations

Decorations buttons already use widget.Clickable and draw press ink, but they don't draw a hover/focus background. This makes custom window decorations appear unresponsive when the pointer is over minimize, maximize, or close buttons.

Register each button's system action over its clickable area and draw the same hovered background used by other material buttons. This also lets platforms query the button action from the material decorations hit area.

Signed-off-by: qiannian <qianniancn@gmail.com>
This commit is contained in:
Qian Nian
2026-06-14 16:36:52 +08:00
committed by Elias Naur
parent caccb608a5
commit acf5635575
+4 -16
View File
@@ -5,7 +5,6 @@ import (
"image/color" "image/color"
"gioui.org/f32" "gioui.org/f32"
"gioui.org/io/semantic"
"gioui.org/io/system" "gioui.org/io/system"
"gioui.org/layout" "gioui.org/layout"
"gioui.org/op" "gioui.org/op"
@@ -86,21 +85,10 @@ func (d DecorationsStyle) layoutDecorations(gtx layout.Context) layout.Dimension
continue continue
} }
cl := d.Decorations.Clickable(a) cl := d.Decorations.Clickable(a)
dims := cl.Layout(gtx, func(gtx layout.Context) layout.Dimensions { dims := Clickable(gtx, cl, func(gtx layout.Context) layout.Dimensions {
semantic.Button.Add(gtx.Ops) system.ActionInputOp(a).Add(gtx.Ops)
return layout.Background{}.Layout(gtx, paint.ColorOp{Color: d.Foreground}.Add(gtx.Ops)
func(gtx layout.Context) layout.Dimensions { return inset.Layout(gtx, w)
defer clip.Rect{Max: gtx.Constraints.Min}.Push(gtx.Ops).Pop()
for _, c := range cl.History() {
drawInk(gtx, c)
}
return layout.Dimensions{Size: gtx.Constraints.Min}
},
func(gtx layout.Context) layout.Dimensions {
paint.ColorOp{Color: d.Foreground}.Add(gtx.Ops)
return inset.Layout(gtx, w)
},
)
}) })
size.X += dims.Size.X size.X += dims.Size.X
if size.Y < dims.Size.Y { if size.Y < dims.Size.Y {