Two things made the eyes jump. The body bobbed two units per step and the head
rode along with it, and each eye ran its own random blink timer, so the cat
winked one eye at a time at intervals of its own choosing.
The bob is now a property on the cat rather than an animation owning torso.y,
the amplitude is softer, and the head translates against it by 75 percent, the
way a walking cat keeps its head level. Measured on a 240 px cat, the eye's
vertical travel per step went from 4.0 px to 0.8 px.
Both eyes now share one eyelid, driven by a single timer and a single
animation. That also removes the Behavior that was fighting the blink animation
for the same property, and the mid-blink flicker to the drawn closed-eye arch,
which now only appears when the eyes are really shut.
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 chip window was 60 x 44 with the curl tumbling about its centre. The curl
reaches 24.2 units from that pivot once the stroke is counted, so a half height
of 22 clipped the top and bottom off it on every turn.
The box is now 52 x 58 with the pivot at (26, 33), measured off the actual
Bezier curve rather than its control points. The shadow sits at 15.1 below the
pivot, which is where the curl comes to rest, so the chip lands on its own
shadow instead of floating above it.
The endless rotation is gone. Each bat now adds one or two whole turns in the
direction it was hit and coasts to a stop, so the resting silhouette is always
the same one, the one the shadow was placed under.
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>