verify
How to drive hyprscreen's GTK UI end-to-end on this machine (real input injection, window screenshots) to verify changes.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
How to drive hyprscreen's GTK UI end-to-end on this machine (real input injection, window screenshots) to verify changes.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | verify |
| description | How to drive hyprscreen's GTK UI end-to-end on this machine (real input injection, window screenshots) to verify changes. |
Runs on the live Hyprland session (no headless setup needed).
/dev/uinput is user-writable (ACL) and python-evdev is installed, so real
clicks and keystrokes can be injected at the compositor level:
hyprctl dispatch movecursor <x> <y> (global
logical coordinates).UInput script
(create the virtual device, sleep ~1s so Hyprland picks it up, then
write EV_KEY events). Chain click/type/key steps in one invocation.Two hazards learned the hard way:
hyprctl dispatch focuswindow address:<a> + confirm via hyprctl -j activewindow immediately before a
typing batch, and if the user is mid-session, ask for a hands-off window
(or let them test manually) instead of injecting blind.This supersedes older notes saying pointer automation is impossible here (no ydotool/wtype — still true, but uinput works directly).
hyprctl -j clients | jq '.[] | select(.title=="…")' —
at/size are global logical px.grim -g "<x>,<y> <w>x<h>" out.png. Output is physical px;
the ratio image_width / logical_width (≈1.666 here) converts pixel
positions found in the screenshot back to logical click coordinates
(divide by ratio, add window origin).Most windows (annotate editor, thumbnail, HUD) only open mid-flow. Add a
temporary CLI arm in src/cli/mod.rs that opens the target window directly,
e.g. for the annotate editor: gtk::init(), build a gtk::Application with
a debug app id, in connect_activate call crate::app::load_css() (needs a
temporary pub), std::mem::forget(app.hold()) so the app survives the
window closing, then crate::ui::annotate::open(&image, |_| {}).
Remove the hook before committing.
Gotcha: app.hold() keeps the first process alive, and GApplication
uniqueness routes a second launch to it — with the old closure arguments.
pkill -x hyprscreen between runs (pkill -f kills your own shell).