Skip to main content

Command Palette

Search for a command to run...

Fixing Flameshot on Hyprland (Wayland & ArchLinux)

Published
3 min read
Fixing Flameshot on Hyprland (Wayland & ArchLinux)
S
I am shkz, a Security Researcher, Red Team and CTF Player.

Flameshot is one of those tools I end up using all the time. It is simple, lightweight, and just works for quick screenshots. You can capture, annotate, blur sensitive data, and copy straight to the clipboard without thinking too much.

For pentesting, daily work, or even during certifications, it fits perfectly. It is fast, minimal, and does not get in the way.

That is why this issue was annoying enough to dig into.

I ran into this while using Hyprland (Wayland) with a mixed monitor setup and Flameshot just refused to behave. The overlay was cut, offset, or only covering part of the screens.

This is not random. It comes from how Flameshot handles Wayland and multi-monitor layouts.

The official docs mention the basics (XDG portals, grim, etc): https://flameshot.org/docs/guide/wayland-help/

That is necessary, but not enough when your layout is not clean.

My setup (example)

This is just my case, you will need to adapt it:

  • one horizontal monitor (1920x1080)

  • one vertical monitor (1080x1920, rotated)

  • layout offset with negative Y

With this, Flameshot fails to understand the real screen space.

First, make sure Wayland basics are covered

Hyprland needs XDG portals so apps can capture the screen.

sudo pacman -S xdg-desktop-portal xdg-desktop-portal-hyprland

Also make sure Flameshot is using grim (this is in the docs, but easy to miss):

~/.config/flameshot/flameshot.ini
[General]
disabledGrimWarning=true
useGrimAdapter=true

The actual problem

Most examples use something like:

size = (monitor_w*2) (monitor_h)

This only works if:

  • monitors have the same resolution

  • no rotation

  • no weird offsets

Once you break that, it stops working.

The fix (manual windowrule)

Instead of trusting Flameshot, just define the real screen area yourself.

hyprland.conf:

windowrule {
    name = flameshot-multi-display-fix
    match:class = flameshot

    float = on
    pin = on
    move = 0 -420
    size = 3000 1920

    rounding = 0
    border_size = 0
    animation = fade
}

What matters here

move

move = 0 -420

This sets where the capture area starts. In my case, one monitor sits higher, so I needed a negative Y. You need to look at your layout and match the highest point across all monitors.

size

size = 3000 1920

This is the full bounding box of everything combined.

My math:

  • width = 1920 (main) + 1080 (vertical) = 3000

  • height = total vertical span = 1920

Yours will be different. Think in terms of total canvas, not individual screens.

Why this works

Flameshot is not aware of complex layouts on Wayland. Instead of trying to make it figure it out, you give it the exact area it should cover. It looks a bit manual, but it is stable.