focal is a rofi menu for capturing and copying screenshots or videos on hyprland / sway.
Wallpaper made by the awesome Rosuuri
- rofi menu to select area / window / entire screen to capture
- rofi menu to select delay before capture
- image / video is automatically copied to clipboard, ready for pasting into other programs
- notifications that open captured file when clicked
- all options are also available via the CLI
- supports either hyprland or sway
- OCR support to select text from captured image (CLI only)
{
inputs.focal = {
url = "github:iynaix/focal";
inputs.nixpkgs.follows = "nixpkgs"; # override this repo's nixpkgs snapshot
};
}
Then, include it in your environment.systemPackages
or home.packages
by referencing the input:
# for hyprland
inputs.focal.packages.${pkgs.system}.default
# for sway
inputs.focal.packages.${pkgs.system}.focal-sway
Alternatively, it can also be run directly:
# for hyprland
nix run github:iynaix/focal
# for sway
nix run github:iynaix/focal#focal-sway
OCR support can be optionally disabled through the use of an override:
(inputs.focal.packages.${pkgs.system}.default.override { ocr = false; })
$ focal --help
focal is a rofi menu for capturing and copying screenshots or videos on hyprland / sway.
Usage: focal image [OPTIONS] <--rofi|--area <AREA>|--selection|--monitor|--all> [FILE]
focal video [OPTIONS] <--rofi|--area <AREA>|--selection|--monitor|--stop> [FILE]
focal help [COMMAND]...
Options:
-h, --help Print help
-V, --version Print version
focal image:
Captures a screenshot.
-a, --area <AREA> Type of area to capture [aliases: capture] [possible values: monitor, selection, all]
--selection
--monitor
--all
-t, --delay <DELAY> Delay in seconds before capturing
-s, --slurp <SLURP> Options to pass to slurp
--no-rounded-windows Do not show rounded corners when capturing a window. (Hyprland only)
--no-notify Do not show notifications
--no-save Do not save the file permanently
--rofi Display rofi menu for selection options
--no-icons Do not show icons for rofi menu
--theme <THEME> Path to a rofi theme
-e, --edit <COMMAND> Edit screenshot using COMMAND
The image path will be passed as $IMAGE
--ocr [<LANG>] Runs OCR on the selected text
-h, --help Print help (see more with '--help')
[FILE] Files are created in XDG_PICTURES_DIR/Screenshots if not specified
focal video:
Captures a video.
-a, --area <AREA> Type of area to capture [aliases: capture] [possible values: monitor, selection]
--selection
--monitor
-t, --delay <DELAY> Delay in seconds before capturing
-s, --slurp <SLURP> Options to pass to slurp
--no-rounded-windows Do not show rounded corners when capturing a window. (Hyprland only)
--no-notify Do not show notifications
--no-save Do not save the file permanently
--rofi Display rofi menu for selection options
--no-icons Do not show icons for rofi menu
--theme <THEME> Path to a rofi theme
--stop Stops any previous video recordings
--audio Capture video with audio
--duration <SECONDS> Duration in seconds to record
-h, --help Print help (see more with '--help')
[FILE] Files are created in XDG_VIDEOS_DIR/Screencasts if not specified
focal help:
Print this message or the help of the given subcommand(s)
[COMMAND]... Print help for the subcommand(s)
Tip
Invoking focal video
a second time stops any currently recording videos.
Example usage as a hyprland keybinding:
bind=$mainMod, backslash, exec, focal image --area selection
Similarly, for a sway keybinding:
bindsym $mod+backslash exec "focal image --area selection"
An optional focal-waybar
script is available for waybar to indicate when a recording is in progress.
$ focal-waybar --help
Updates waybar module with focal's recording status.
Usage: focal-waybar [OPTIONS] [FOCAL_ARGS]...
Arguments:
[FOCAL_ARGS]... Additional arguments to pass to 'focal video'
Options:
--toggle Start / stop focal recording
--signal <N> Signal number to update module (SIGRTMIN+N), default is 1 [default: 1]
--recording <MESSAGE> Message to display in waybar module when recording [default: REC]
--stopped <MESSAGE> Message to display in waybar module when not recording [default: ]
-h, --help Print help
-V, --version Print version
Create a custom waybar module similar to the following:
{
"custom/focal": {
"exec": "focal-waybar --signal 1 --recording 'REC'",
"format": "{}",
"interval": "once",
"on-click": "focal video --stop",
"signal": 1
},
}
focal video recordings can then be started / stopped using keybindings such as:
hyprland:
bind=$mainMod, backslash, exec, focal-waybar --toggle --signal 1 --recording 'REC' --rofi
sway:
bindsym $mod+backslash exec "focal-waybar --toggle --signal 1 --recording 'REC' --rofi"
To build focal from source
- Build dependencies
- Rust (cargo, rustc)
- Runtime dependencies
Just use nix develop