Repository navigation
Screen Capture and Recording
Capturing your screen in ii-p3drovfx is one continuous pipeline: the same Region Selector that takes screenshots also starts recordings, the shell tracks the recording live (bar indicator, Dynamic Island notch, pause/resume), and the finished file lands straight in the Video Editor — or LosslessCut, if that's more your speed.
This page covers the recording half. Screenshots and annotation live on the Screenshot Editor page.
| Keys | Action |
|---|---|
| Ctrl + Alt + R | Record the full screen (no sound) |
| Super + Shift + Alt + R | Record the full screen with system audio |
| Super + Shift + R | Record a region — select it like a screenshot |
Press the same keys (or the Bar's recording indicator, or the Dashboard's Screen Record toggle) to stop. While recording, the Bar shows a red indicator with pause/resume at hand, and when you stop, a "Recording finished — edit it?" prompt offers the Video Editor for a quick trim.
Recordings land in your configured video path (Settings → Screenshots & Recording), where you can also switch the backend, codec and frame rate — read on for that.
- From the Region Selector — the selector's actions include Record Region and Record Region with Sound: select an area exactly like a screenshot, and the geometry is handed to the recorder. If a recording is already running, invoking the selector's record action triggers the stop workflow instead.
- Full-monitor recording is available alongside region capture.
- From the shell — the recording indicator widget and utility buttons on the Bar, the Dashboard's Screen Record quick toggle, and a desktop Screen Record pill widget all start/stop recordings.
While recording, the shell shows an always-expressive recording indicator in the Bar, an optional Dynamic Island recording notch, and exposes pause/resume controls. A separate screen-sharing indicator (backed by the PipeWire-based Privacy service) shows when an app is capturing your screen — recording and sharing are tracked independently.
Pick your recorder in Settings → Screenshots & Recording:
The shell manages wf-recorder directly. Configurable: save path, GPU acceleration, codec, bitrate, and target frame rate.
Hardware encoding — with the codec on Auto, the recording script inspects the FFmpeg encoders actually available and picks accordingly:
| Vendor | Encoders |
|---|---|
| NVIDIA |
h264_nvenc, hevc_nvenc
|
| Intel / AMD (VA-API) |
h264_vaapi, hevc_vaapi
|
| AMD (AMF) |
h264_amf, hevc_amf
|
| CPU fallback |
libx264, libx265
|
Disable GPU acceleration and it simply falls back to software encoding.
Region + audio — the selected geometry is passed straight to wf-recorder. For Record Region with Sound, the script finds a PulseAudio/PipeWire monitor source (deriving one from the default sink if needed) so system audio lands in the file, in sync.
Pause — here's a fun implementation detail: wf-recorder has no pause feature at all. The shell pauses it anyway, by sending SIGSTOP to freeze the process and SIGCONT to resume — the output file stays alive, and the paused span shows up as a still frame in the video.
Prefer OBS? The shell drives it programmatically over the OBS WebSocket API (default localhost:4455; override with OBS_API_HOST, OBS_API_PORT, and OBS_API_PASSWORD — so authentication never gets hardcoded into QML). The integration can launch OBS on demand, wait for its WebSocket server, start and stop recording, detect failures, close OBS afterward, retrieve the file, and forward it to the editor. Both native and Flatpak OBS installations work.
Two OBS-specific behaviors worth knowing:
- Wayland portals — starting an OBS capture may pop the desktop portal's source-selection dialog. The script doesn't assume failure just because recording isn't active yet; it waits until OBS actually reports a recording in progress.
- Region recording — OBS captures the screen; the selected region is cropped afterward with FFmpeg before the file reaches the editor.
Pause/resume is forwarded through the OBS control scripts.
The recording script maintains shell-visible state (active, loading, paused, elapsed time) through the Quickshell state system — that's what keeps the Bar indicator, the Dynamic Island notch and the quick toggles in sync with the real recorder, whichever backend is running.
The recorder sends the file path back into the shell, and — with the edit prompt enabled — the compact "Recording finished — edit it?" popup appears. From there:
- Edit Video opens the built-in Video Editor with the file loaded, or
- with Open in LosslessCut enabled, the prompt hands the recording to LosslessCut instead — great for instant lossless trims.
Recordings deliberately don't trigger the screenshot shutter sound.
Settings → Screenshots & Recording collects everything: recorder backend (wf-recorder / OBS), video record path, GPU acceleration, codec, bitrate, frame rate, recording notifications, the edit prompt toggle and the LosslessCut option — plus all the screenshot-side options described on the Screenshot Editor page. Persistent options live under Config.options.screenRecord.
| Piece | Role |
|---|---|
scripts/videos/record.sh |
The conductor: backend selection, region + audio capture, encoder selection, pause/resume, state file updates, OBS lifecycle, post-recording editor launch |
scripts/videos/obs_control.py / obs_pause.py
|
Thin OBS WebSocket controllers (obsws_python): start, stop, toggle, status, pause |
services/Privacy.qml |
PipeWire-based detection of active screen sharing and microphone use |
scripts/screenShare/ |
Screen-share state helper for the Bar indicator |
modules/ii/videoEditor/VideoEditorPopup*.qml |
The post-recording prompt |
Dependencies: wf-recorder or OBS Studio (+ obsws-python), FFmpeg, jq, PipeWire/PulseAudio tools, notify-send. Only the backend you actually use needs to be installed.