Files
TNCcat/qml/CatWindow.qml
JulianandClaude Opus 5 a01843a312 Revert the X11 window shaping
It did not build, xcb_shape_id was not resolving, and it was not worth fixing.
It bought a workaround for one configuration, cost two libraries and a window
grab fifteen times a second, and still gave harder edges than the thing it was
working around.

Qt's transparent window background is the right mechanism and it already works.
On X11 it needs a compositing manager, which Xfce ships with and which was
simply switched off. The warning that names that setting stays, so the cause
shows up in the log.

Kept from the reverted commit: opaque mode paints a neutral card rather than
the coat colour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 10:21:51 +02:00

101 lines
3.2 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import TNCat
// One small window that is exactly the cat. Used wherever a client may place
// its own window, which is everything except Wayland.
Window {
id: win
required property CatController cat
required property AppSettings settings
signal settingsRequested()
width: settings.catSize
// The drawing knows its own proportions; no constant to keep in sync.
height: Math.round(width * sprite.implicitHeight / sprite.implicitWidth)
x: cat.x
y: Screen.desktopAvailableHeight - height - settings.bottomMargin
// A neutral card reads better than the coat colour when the background
// cannot be transparent at all.
color: Platform.opaqueBackground ? "#f2f0ec" : "transparent"
flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool
| Qt.NoDropShadowWindowHint | Qt.WindowDoesNotAcceptFocus
| (Platform.bypassWindowManager ? Qt.X11BypassWindowManagerHint : 0)
visible: true
title: qsTr("TNCat")
Component.onCompleted: {
cat.stageWidth = Screen.desktopAvailableWidth
cat.catWidth = width
Platform.checkTranslucency(win)
if (Platform.debug)
win.logGeometry("created")
}
function logGeometry(what) {
console.log("TNCat cat window", what,
"x", win.x, "y", win.y, "w", win.width, "h", win.height,
"| screen", Screen.width + "x" + Screen.height,
"available", Screen.desktopAvailableWidth + "x" + Screen.desktopAvailableHeight,
"| platform", Platform.name, "overlay", Platform.overlayMode)
}
onHeightChanged: if (Platform.debug) logGeometry("height changed")
onWidthChanged: {
cat.catWidth = width
if (Platform.debug)
logGeometry("width changed")
}
Screen.onDesktopAvailableWidthChanged: cat.stageWidth = Screen.desktopAvailableWidth
// The eyes need to know where the face sits on the desktop.
Binding {
target: win.cat
property: "catCenter"
value: Qt.point(win.x + win.width / 2, win.y + win.height / 2)
}
Cat {
id: sprite
anchors.fill: parent
coat: win.settings.coat
facingRight: win.cat.facingRight
mood: win.cat.moodName
lifted: win.cat.dragging
petted: win.cat.hovered && !win.cat.dragging
look: win.cat.look
showCodes: win.settings.showCodes
Accessible.role: Accessible.Button
Accessible.name: qsTr("TNCat")
}
HoverHandler {
onHoveredChanged: win.cat.hovered = hovered
}
DragHandler {
target: null
onActiveChanged: win.cat.dragging = active
onCentroidChanged: {
if (active)
win.cat.x = Math.max(0, Math.min(win.cat.stageWidth - win.width,
win.x + centroid.position.x - centroid.pressPosition.x))
}
}
TapHandler {
acceptedButtons: Qt.LeftButton
onTapped: win.cat.pet()
onDoubleTapped: win.settingsRequested()
onLongPressed: win.settingsRequested()
}
TapHandler {
acceptedButtons: Qt.RightButton
onTapped: win.settingsRequested()
}
}