Workcat: cute desktop cat, no window closing

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>
This commit is contained in:
JulianandClaude Opus 5 committed 2026-09-10 22:20:35 +02:00
commit acef398f49
17 files changed
+1584

No files matched your search

+77
View File
@@ -0,0 +1,77 @@
# Workcat (Qt Quick / CMake example)
A little cat that wanders along the bottom edge of your screen, sits down,
grooms itself, stretches, dashes off and takes naps. Drag it around, click to
pet it, and it purrs. It does nothing else — no window closing, no monitoring.
Inspired by [workcat.app](https://workcat.app/en/), rebuilt as a plain Qt 6 /
QML project. Primary target is **Linux / X11**; development happens on macOS and
both are supported by the same code.
## Layout
| Path | Purpose |
|---|---|
| `CMakeLists.txt` | `qt_add_executable` + `qt_add_qml_module` (URI `Workcat`), macOS bundle, `.desktop` file on Linux |
| `src/main.cpp` | Wires `AppSettings` and `CatController` into the QML engine, warns on Wayland |
| `src/catcontroller.*` | Mood machine (walk, run, sit, groom, stretch, sleep, love, alert), movement tick, cursor tracking |
| `src/appsettings.*` | `QSettings`-backed coat, size, pace, eye tracking, pet counter |
| `src/platforminfo.*` | QML singleton `Platform`: platform name plus the two X11 escape hatches |
| `src/traycontroller.*` | Tray icon and menu, silently skipped when the desktop has no tray |
| `qml/Main.qml` | Frameless, transparent, always-on-top window that *is* the cat |
| `qml/Cat.qml` | The drawing: rounded primitives plus `Shape` paths for tail, ears and mouth |
| `qml/SettingsWindow.qml` | Coat swatches, size, pace, eye tracking, trick buttons |
The cat is drawn in a fixed 100 x 90 design space and scaled by `width / 100`,
so every size setting stays crisp. There are no image assets.
## Build
macOS with the Qt online installer:
```bash
~/Qt/6.11.1/macos/bin/qt-cmake -S . -B build -G Ninja -DCMAKE_MAKE_PROGRAM=$HOME/Qt/Tools/Ninja/ninja
```
Linux with distribution Qt packages:
```bash
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
```
```bash
cmake --build build
```
Needs Qt 6.8 or newer for `Shape.CurveRenderer`. Required modules: Core, Gui,
Quick, QuickControls2, Widgets. Widgets is only there because `QSystemTrayIcon`
needs it for its context menu.
## Running on X11
The cat is a frameless, transparent, always-on-top `Qt::Tool` window that places
itself. Two environment variables cover the cases where a window manager
disagrees:
| Variable | Effect |
|---|---|
| `WORKCAT_X11_BYPASS=1` | Adds `Qt::X11BypassWindowManagerHint`, making an override-redirect window. Use when the WM refuses to keep the cat on top or shows it in the taskbar. |
| `WORKCAT_OPAQUE=1` | Paints a solid background instead of relying on transparency. Use when no compositor runs and the cat sits in a black box. |
| `WORKCAT_POSE=Sitting` | Freezes the cat in one mood. Handy for screenshots. Accepts any `CatController::Mood` name. |
Wayland cannot let a client position its own window, so the cat would stay
wherever the compositor puts it. The app prints a warning and suggests
`QT_QPA_PLATFORM=xcb`.
Desktops without a status-notifier host get no tray icon. The cat itself stays
the entry point: right-click or double-click opens the settings window.
## Interaction
| Input | Result |
|---|---|
| Click | Pet the cat, it closes its eyes and purrs |
| Drag | Pick the cat up and put it somewhere else |
| Hover | Blush and purr wiggle |
| Double-click or right-click | Settings window |
| Tray menu | Tricks, nap toggle, settings, quit |