# Live crop (Video FX) You pick **two rectangles**: 1. **Source** — which part of another client to copy, and how large that crop is. 2. **Viewer** — where that crop is drawn on the primary client, and how large it is shown. Numbers `0`–`1` are fractions of that window. Numbers **greater than 1** are pixels inside the window. In the GUI, **Pick source / Pick viewer** uses `slurp` and stores pixels. When the mouse is over the viewer, **clicks and keys go only to the source client**, not to the primary and not to the rest of the team. Configure this in the **Video FX** page of the control panel (`enboxer` with no arguments). It is not a second monitor and not a window swap. The other client can sit behind the main one; you still see the cropped piece. ## What Hyprland can actually do | Method | Sees a window that is fully covered? | What we use | | --- | --- | --- | | `grim` of a screen rectangle | No — only pixels currently on the output | **Yes, default** | | `hyprland-toplevel-export` | Yes — compositor copy of that window’s buffer | **Yes, gated behind `ENBOXER_ENABLE_TOPLEVEL=1`** | | Desktop portal / PipeWire | Yes, heavier | No | The dispatcher in `src/vfx.rs::capture_for_source` checks `is_window_visible(monitors, client)`. If the source window sits on a visible output, `grim` captures it. If the window is covered and the operator has opted in to compositor-side capture (`ENBOXER_ENABLE_TOPLEVEL=1`), the dispatcher routes to `capture_toplevel` (zwlr_export_dmabuf_unstable_v1). With the gate off, covered windows fall through to `grim` and the operator sees whatever is currently on top of those pixels — exactly the previous behaviour. So: keep the source window **on a visible output** for the default `grim` path. Set `ENBOXER_ENABLE_TOPLEVEL=1` when you want a stacked layout where some sources are fully covered by another; the live toplevel-export client is a follow-up and the dispatcher is ready for it. The overlay itself is an `mpv` window (`class: enboxer-vfx`) that reloads each `grim` frame.