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>
101 lines
3.2 KiB
QML
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()
|
|
}
|
|
}
|