Give notification popups a fixed-size surface to stop resize scaling
The popups used one Wayland layer surface per output sized to their content (implicitWidth/Height bound to the toast column), so every time a toast was added or removed the surface resized. During that resize the compositor briefly scaled a stale buffer, stretching or squishing the cards mid- transition -- worst with only one or two toasts, where each resize is a larger relative change. Make the surface full-screen and fixed, like the OSD overlay, so adding or removing a toast only changes the content inside it and the surface never resizes. Mask the input region to the toast column so the otherwise- invisible full-screen overlay stays click-through. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
2c8639ffbd
commit
b1a9d7912e
@@ -787,26 +787,27 @@ Item {
|
|||||||
readonly property var popupPlacement: NotificationLogic.popupPlacement(
|
readonly property var popupPlacement: NotificationLogic.popupPlacement(
|
||||||
service.barPosition, service.barClearance, Style.gapsOut)
|
service.barPosition, service.barClearance, Style.gapsOut)
|
||||||
|
|
||||||
anchors {
|
// Full-screen, fixed-size surface (like the OSD overlay). Adding or
|
||||||
top: popupWindow.popupPlacement.anchors.top
|
// removing a toast changes only the content inside; the Wayland surface
|
||||||
bottom: popupWindow.popupPlacement.anchors.bottom
|
// never resizes, so the compositor can't briefly scale a stale buffer --
|
||||||
left: popupWindow.popupPlacement.anchors.left
|
// which is what stretched/squished the cards during count changes.
|
||||||
right: popupWindow.popupPlacement.anchors.right
|
anchors { top: true; bottom: true; left: true; right: true }
|
||||||
}
|
|
||||||
margins {
|
|
||||||
top: popupWindow.popupPlacement.margins.top
|
|
||||||
bottom: popupWindow.popupPlacement.margins.bottom
|
|
||||||
left: popupWindow.popupPlacement.margins.left
|
|
||||||
right: popupWindow.popupPlacement.margins.right
|
|
||||||
}
|
|
||||||
|
|
||||||
implicitWidth: popupColumn.implicitWidth
|
// Keep the surface click-through except over the toast column, so the
|
||||||
implicitHeight: popupColumn.implicitHeight
|
// rest of the (invisible) full-screen overlay never eats input.
|
||||||
|
mask: Region {
|
||||||
|
x: popupColumn.x
|
||||||
|
y: popupColumn.y
|
||||||
|
width: popupColumn.width
|
||||||
|
height: popupColumn.height
|
||||||
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
id: popupColumn
|
id: popupColumn
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: popupWindow.popupPlacement.margins.top
|
||||||
|
anchors.rightMargin: popupWindow.popupPlacement.margins.right
|
||||||
spacing: Style.space(8)
|
spacing: Style.space(8)
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
|
|||||||
Reference in New Issue
Block a user