Main.qml declared both layouts at once: the small per-object windows and the
full-screen overlay. Both of them write the controller's catCenter, which is
where the eyes look for the cursor. Two bindings on one property overwrite each
other, so catCenter alternated every frame between the cat window's real centre
and the hidden overlay's, whose height is zero. look.y flipped between -0.495
and 1.0 sixty times a second and the pupils jumped with it.
Each layout now sits behind its own Loader and only the one the platform needs
is built. The small windows moved into Desktop.qml so a single component can
hold all three of them.
Measured in the running app while walking, the eye's vertical travel went from
2.6 px to 0.40 px, and look.y is now a single steady value. It also stops a
second, invisible cat from animating in the background.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The binary now links Core, Gui, Quick and QuickShapes, nothing else.
Qt Widgets was there for one reason, QSystemTrayIcon, so the tray icon is gone
and QApplication is back to QGuiApplication. The cat itself is the whole
interface: right-click or long-press opens the settings window, which carries
the tricks and a quit button. Ctrl+C in the terminal works as well.
The settings window is rebuilt from Qt Quick primitives. AppButton, AppSlider,
AppToggle and SettingsGroup replace the Controls types, keyboard handling and
accessible roles included, and a Flickable with plain positioners replaces
QtQuick.Layouts.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The cat was drawn in a 100 x 90 box that was exactly the window, so anything
reaching past it was cut off: the right whiskers always, and more of them in
poses that push the head forward, up to art x 109 while stretching.
The window box is now 120 x 106 with the drawing inset at (7, 14). The slack is
symmetric on purpose, because facing left mirrors the art about the box centre,
so asymmetric slack would clip the other side instead.
The mood-name mapper grew the shared aspect ratio and became CatDefs, so every
window sizes the cat the same way. Nose and mug offsets follow the new inset.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every so often a mug appears at the cat's nose, it sits down, dips its head in
and takes a few slow sips while steam rises. M01, optional stop.
The mug lives in its own click-through window like the chip, or inside the
overlay on Wayland. It goes away as soon as the cat is petted, dragged, sent to
sleep or moves on to something else, so no mug is ever left standing.
Also renames OverlayWindow's mode flag, which shadowed QWindow::active.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The project is now TNCat, after HEIDENHAIN's TNC controls. Binary, QML module
URI, settings path, bundle id and .desktop entry follow; the environment
switches are TNCAT_*.
Entertainment: a curled steel chip skitters in every minute or two, the cat
runs it down and bats it away a few times before sitting back looking pleased.
Mood changes flash the matching machine code above its head, G00 for a sprint,
G01 for a stroll, M08 while it washes, G28 for a stretch, M30 for a nap.
Window handling was split into two layouts. X11 and macOS keep one small window
per object, positioned by the app. Wayland gets a screen-filling overlay whose
input region is masked down to the cat, since a Wayland client cannot place its
own window. Overlay mode is automatic there and available elsewhere via
TNCAT_OVERLAY=1.
Also adds a ground-line setting so the cat can walk above a softkey row.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reworks the example into a pure desktop-pet: the cat wanders, sits, grooms,
stretches, dashes and naps, reacts to petting and dragging, and follows the
cursor with its eyes. The window-scanning and Accessibility code is gone.
The cat is drawn from rounded primitives plus Shape paths in a fixed 100x90
design space, so it scales cleanly to any size.
Linux/X11 is the primary target: the tray is optional, Wayland gets a warning,
and WORKCAT_X11_BYPASS / WORKCAT_OPAQUE cover uncooperative window managers.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>