Repository navigation
faq
You can enable the drag_tile_to_tile option in your config. This allows you to drag a tiled window onto another to swap them.
drag_tile_to_tile=1Blur applies to the transparent areas of windows. To disable it entirely, set blur=0.
If you are experiencing performance issues with blur, make sure blur_optimized=1 (the default). This caches the wallpaper as the blur background, which is much cheaper on the GPU:
blur_optimized=1This is expected behavior when blur_optimized=1 (the default). The optimizer caches the wallpaper to reduce GPU load — windows will blur against the wallpaper rather than the actual content stacked beneath them.
If you want blur to composite against the true background (i.e., show whatever is actually behind the window), set:
blur_optimized=0Warning: Disabling
blur_optimizedsignificantly increases GPU consumption and may cause rendering lag, especially on lower-end hardware.
Try enabling SyncObj timeline support.
sync_obj_enable=1You can enable Tearing (similar to VSync off).
First, enable it globally:
allow_tearing=1Then force it for your specific game:
window_rule=force_tearing:1,title:Counter-Strike 2Warning: Some graphics cards require setting
env=WLR_DRM_NO_ATOMIC,1in config before mango starts for tearing to work. See Monitors — Tearing for details.
Some X11 games (typically Proton/Wine titles, e.g. Satisfactory) capture the mouse by hiding the cursor and grabbing the pointer with confine_to. Xwayland emulates that with a locked pointer constraint, and that lock can be dropped by Xwayland itself (when the game releases the X11 confine while keeping the mouse captured). Once the lock is gone the compositor has nothing left to confine the pointer, so the cursor can move onto another monitor.
Add a window rule to force the cursor to stay inside the game window while it is focused:
window_rule=confine_pointer:1,app_id:steam_app_526870Use app_id: or title: to match your game — see Window Rules for the available matching options.
confine_pointer=1 keeps the cursor 5px inside the window's surface whenever that window is the focused, visible window. The confinement is released as soon as the window loses focus, gets hidden, minimized, or moved to a hidden tag. It does not rely on the pointer constraints protocol.
Some games (Proton/Wine titles) open a short-lived helper window (a splash/loading window showing the app id) before the real game window. A rule like
window_rule=confine_pointer:1,is_fullscreen:1,app_id:steam_app_526870matches every window of that app, including that helper window, so mango forces it to fullscreen as well. The helper window then gets _NET_WM_STATE_FULLSCREEN and a resize to the whole monitor, and when the real game window maps mango's "a new tiled window kicks the fullscreen window out of fullscreen" logic un-fullscreens and re-tiles it again. Wine ties its mouse capture and cursor visibility to those window states, so after this churn the game ends up with a broken capture state: the cursor is not hidden, the pointer lock is created and dropped repeatedly, and the game's own cursor and the compositor cursor disagree (e.g. the menu cursor is not where the game thinks it is).
Restrict is_fullscreen to the real game window with title: (the helper window has no title):
window_rule=confine_pointer:1,app_id:steam_app_526870
window_rule=is_fullscreen:1,app_id:steam_app_526870,title:SatisfactoryRules match on app_id and title when both are given, so only the main window is made fullscreen.
The standard spawn command does not support shell pipes directly. You must use spawn_shell instead.
bind=SUPER,P,spawn_shell,echo "hello" | rofi -dmenubind automatically converts keysym to keycode, which is compatible with most layouts but can sometimes be imprecise. If a key combination is not triggering, use the keycode directly instead of the key name.
Run wev and press the key to find its keycode, then use it in your bind:
# Instead of:
bind=ALT,q,killclient
# Use the keycode (e.g., code:24 = q on most layouts):
bind=ALT,code:24,killclientYou can also use binds (the s flag) to match by keysym instead of keycode:
binds=ALT,q,killclient