You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 32d4093
Browse filesBrowse the repository at this point in the historyBrowse files
flutter_tray_icon_example: popup mode, and the Omarchy theme's colour for Auto
Properties -> Popup (or TRAY_POPUP=1) makes the window behave like a tray utility's: no
title bar, a click on the icon shows it or hides it, losing the focus hides it. On
Wayland the compositor places it; the README gives the Hyprland window rule that puts
it under the icon, and tools/gui/flutter_tray_popup_test_hyprland.py checks the whole
sequence with a real click in Omarchy's bar. On Omarchy the Auto icon colour is the
desktop theme's foreground and follows a theme switch.
tools/gui/README.md also lists core's window_shadow_remap_linux_test.
Copy file name to clipboardExpand all lines: tools/gui/README.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,6 +30,8 @@ runner) lives in [`.agents/skills/`](../../.agents/skills); read
30
30
|`core_drag_drop_test.py` / `.ps1`| core `drag_drop_example` (C++) | macOS / Windows |`DragSource` → `DropTarget` across two windows: enter / move / drop events, dropped file path and text, drop position in content coordinates, source reports `copy`; a drag released where nothing accepts it reports exit and `none`|
31
31
|`flutter_drag_drop_test.py` / `.ps1`|`drag_drop_example`| macOS / Windows |`DragOutArea` → `DropRegion` in one window: a file and a text drop arrive, the source sees `copy`, the highlight clears, a second drag works after the first |
32
32
| `flutter_tray_icon_test.py` / `.ps1` / `_linux.py` | `tray_icon_example` | macOS / Windows (WinUI 3 and Native menu backends) / Linux | animated tray icons: frames really are rendered and pushed (counter, 30 and 60 fps, no dropped frames, Pause / Step / Resume, 3x resolution), a live widget captured into frames, the Download scene driving the title, three icons animating at once; title / tooltip / visibility / trigger / bounds read back from the native getters; the menu opened from code shows its items and states, an item click arrives, `closeContextMenu` closes it; "Window to icon" puts the window below the icon on macOS and above it on Windows, centred on it; the example's own checklist has no unexpected failures. Windows tray icons have no title, so the title checks become one no-op check there. On Linux the icon is a StatusNotifierItem: no bounds and no menu opened from code, so the test checks the example does not offer them; the frame pipeline is asserted at 10 fps (what 30 fps gives on the host is printed), and the icons are counted where the shell counts them: `RegisteredStatusNotifierItems` lists one, then three, then one again after two are removed. Not covered: clicks on the tray icon itself — the input driver refuses the menu-bar layer, those stay manual items of the example's Checklist tab |
33
+
| `flutter_tray_popup_test_hyprland.py` | `tray_icon_example` | Linux (Hyprland, the Omarchy laptop) | the example's popup mode (`TRAY_POPUP=1`, or Properties → Popup) together with a Hyprland window rule placed by `cursor_x`/`cursor_y`: a real left click on the tray icon in the bar (located by diffing two `grim` captures of the bar, pressed through `wlpointer`, the kit's zwlr_virtual_pointer tool) maps the window floating and pinned with its right edge 20 px right of the click and its top 20 px below it, under the bar, focused; focusing another window hides it (`[popup] hidden (blur)` on stdout); `Activate` over D-Bus with the cursor in the middle of the screen maps it there (the rule is re-evaluated on every map because the example hides instead of lowering); a click while it shows hides it. The rule is installed into `~/.config/hypr/hyprland.lua` for the run (a marked `require` line plus a file next to it) and removed again, both checked with `hyprctl configerrors`. Needs the item pinned in Omarchy's tray (new items sit in a collapsed drawer) and a Lua-config Hyprland (0.56+: `hyprctl dispatch` takes `hl.dsp.*` calls) |
34
+
|`core/tests/window_shadow_remap_linux_test` (in core) | core hidden-title-bar shadow | Linux (Hyprland; any compositor) | no-input regression, run floating (`hl.window_rule` for its class on Hyprland): a window whose title bar is hidden keeps its content size across hide and show whatever xdg states the compositor sends - Hyprland reports every window tiled and maximized, and GDK takes no resize while they stand, so core must not add its shadow gutter before the compositor has answered. Three timings of hiding the title bar; exact content size once settled, no gutter band and no growth across shows in all of them |
33
35
|`core_tray_icon_events_test_linux.sh`| core `tray_icon_example` (C++) | Linux | the tray icon's menu export and events, driven over D-Bus the way the shell drives a StatusNotifierItem (the input driver may not press the top bar): with the `RightClicked` trigger the menu is exported (`Menu`, its items in `GetLayout`) without `ItemIsMenu`; `WindowId` is an int32, as gnome-shell reads it; the host's dbusmenu events come back as menu events (`opened` / `closed` on the root once each however often they come, `clicked` on an item); from a host other than gnome-shell `Activate` is a click, a second one within the double-click time a double click (a third starts a new pair, two slow ones are two clicks), `ContextMenu` a right click; `SecondaryActivate` and `Scroll` report nothing yet. Not covered: gnome-shell's own `Activate` (a double click) and a real host's menu, which only real clicks in the top bar show — checked by hand on GNOME 46 and in KDE Plasma 6 |
34
36
|`flutter_launch_at_startup_test.py`|`launch_at_startup`'s own example, in a leanflutter checkout (`$LEANFLUTTER_DIR`, default `~/Projects/leanflutter`; see `common.py`) | macOS | the 0.5.x compatible API on nativeapi: Enable registers an `SMAppService` login item, `isEnabled` reads it back, Disable removes it, and `setup(args:)` neither throws nor leaves an entry behind. Always leaves the login item off, including on a failure. Written but not yet run — the display was asleep; the same sequence was verified headlessly instead |
35
37
|`flutter_detachable_window_and_browser_tabs_demo.py` / `.ps1`| both Flutter examples | macOS / Windows | the demo video scenarios; also the only coverage of `browser_tabs_example` (reorder, tear off, merge, move by the strip; its log ends with the preserved page state, no PASS/FAIL checks) |
@@ -96,6 +98,8 @@ $R linux desktop tools/gui/flutter_floating_toolbar_test_linux.py 120 # no inp
96
98
$R linux desktop tools/gui/flutter_tray_icon_test_linux.py 300 # example built in the host's checkout
97
99
$R linux run tools/gui/build_core_example_linux.sh tray_icon_example
98
100
$R linux desktop tools/gui/core_tray_icon_events_test_linux.sh 60
101
+
$R omarchy setup # Hyprland laptop: pushes wlpointer's sources with the kit
102
+
$R omarchy desktop tools/gui/flutter_tray_popup_test_hyprland.py 240 # example built in the host's staged workspace
99
103
$R linux desktop tools/gui/flutter_window_shape_demo_linux.py 240 # dry run: no recorder
100
104
.agents/skills/record-demo/scripts/record_remote_linux.sh linux \
101
105
tools/gui/flutter_window_shape_demo_linux.py tools/gui/output # the take
0 commit comments