--- title: Rules description: Define behavior for specific windows, tags, and layers. --- ## Window Rules Window rules allow you to set specific properties (floating, opacity, size, animations, etc.) for applications based on their `appid` or `title`. You can set all parameters in one line, and if you both set appid and title, the window will only follow the rules when appid and title both match. **Format:** ```ini windowrule=Parameter:Values,title:Values windowrule=Parameter:Values,Parameter:Values,appid:Values,title:Values ``` ### State & Behavior Parameters | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `appid` | string | Any | Match by application ID, supports regex | | `title` | string | Any | Match by window title, supports regex | | `isfloating` | integer | `0` / `1` | Force floating state | | `isfullscreen` | integer | `0` / `1` | Force fullscreen state | | `isfakefullscreen` | integer | `0` / `1` | Force fake-fullscreen state (window stays constrained) | | `isglobal` | integer | `0` / `1` | Open as global window (sticky across tags) | | `isoverlay` | integer | `0` / `1` | Make it always in top layer | | `isopensilent` | integer | `0` / `1` | Open without focus | | `istagsilent` | integer | `0` / `1` | Don't focus if client is not in current view tag | | `force_maximize` | integer | `0` / `1` (default 1) | The state of client default to maximized | | `ignore_maximize` | integer | `0` / `1` (default 1) | Don't handle maximize request from client | | `ignore_minimize` | integer | `0` / `1` (default 1) | Don't handle minimize request from client | | `force_tiled_state` | integer | `0` / `1` | Deceive the window into thinking it is tiling, so it better adheres to assigned dimensions | | `noopenmaximized` | integer | `0` / `1` | Window does not open as maximized mode | | `single_scratchpad` | integer | `0` / `1` (default 1) | Only show one out of named scratchpads or the normal scratchpad | | `allow_shortcuts_inhibit` | integer | `0` / `1` (default 1) | Allow shortcuts to be inhibited by clients | | `indleinhibit_when_focus` | integer | `0` / `1` (default 0) | Automatically keep idle inhibit active when this window is focused | ### Geometry & Position | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `width` | integer | 0-9999 | Window width when it becomes a floating window | | `height` | integer | 0-9999 | Window height when it becomes a floating window | | `offsetx` | integer | -999-999 | X offset from center (%), 100 is the edge of screen with outer gap | | `offsety` | integer | -999-999 | Y offset from center (%), 100 is the edge of screen with outer gap | | `monitor` | string | Any | Assign to monitor by [monitor spec](/docs/configuration/monitors#monitor-spec-format) (name, make, model, or serial) | | `tags` | integer | 1-9 | Assign to specific tag | | `no_force_center` | integer | `0` / `1` | Window does not force center | | `isnosizehint` | integer | `0` / `1` | Don't use min size and max size for size hints | ### Visuals & Decoration | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `noblur` | integer | `0` / `1` | Window does not have blur effect | | `isnoborder` | integer | `0` / `1` | Remove window border | | `isnoshadow` | integer | `0` / `1` | Not apply shadow | | `isnoradius` | integer | `0` / `1` | Not apply corner radius | | `isnoanimation` | integer | `0` / `1` | Not apply animation | | `focused_opacity` | integer | `0` / `1` | Window focused opacity | | `unfocused_opacity` | integer | `0` / `1` | Window unfocused opacity | | `allow_csd` | integer | `0` / `1` | Allow client side decoration | > **Tip:** For detailed visual effects configuration, see the [Window Effects](/docs/visuals/effects) page for blur, shadows, and opacity settings. ### Layout & Scroller | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `scroller_proportion` | float | 0.1-1.0 | Set scroller proportion | | `scroller_proportion_single` | float | 0.1-1.0 | Set scroller auto adjust proportion when it is single window | > **Tip:** For comprehensive layout configuration, see the [Layouts](/docs/window-management/layouts) page for all layout options and detailed settings. ### Animation | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `animation_type_open` | string | zoom, slide, fade, none | Set open animation | | `animation_type_close` | string | zoom, slide, fade, none | Set close animation | | `nofadein` | integer | `0` / `1` | Window ignores fade-in animation | | `nofadeout` | integer | `0` / `1` | Window ignores fade-out animation | > **Tip:** For detailed animation configuration, see the [Animations](/docs/visuals/animations) page for available types and settings. ### Terminal & Swallowing | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `isterm` | integer | `0` / `1` | A new GUI window will replace the isterm window when it is opened | | `noswallow` | integer | `0` / `1` | The window will not replace the isterm window | ### Global & Special Windows | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `globalkeybinding` | string | `[mod combination][-][key]` | Global keybinding (only works for Wayland apps) | | `isunglobal` | integer | `0` / `1` | Open as unmanaged global window (for desktop pets or camera windows) | | `isnamedscratchpad` | integer | `0` / `1` | 0: disable, 1: named scratchpad | > **Tip:** For scratchpad usage, see the [Scratchpad](/docs/window-management/scratchpad) page for detailed configuration examples. ### Performance & Tearing | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `force_tearing` | integer | `0` / `1` | Set window to tearing state, refer to [Tearing](/docs/configuration/monitors#tearing-game-mode) | ### Examples ```ini # Set specific window size and position windowrule=width:1000,height:900,appid:yesplaymusic,title:Demons # Global keybindings for OBS Studio windowrule=globalkeybinding:ctrl+alt-o,appid:com.obsproject.Studio windowrule=globalkeybinding:ctrl+alt+n,appid:com.obsproject.Studio windowrule=isopensilent:1,appid:com.obsproject.Studio # Force tearing for games windowrule=force_tearing:1,title:vkcube windowrule=force_tearing:1,title:Counter-Strike 2 # Named scratchpad for file manager windowrule=isnamedscratchpad:1,width:1280,height:800,appid:st-yazi # Custom opacity for specific apps windowrule=focused_opacity:0.8,appid:firefox windowrule=unfocused_opacity:0.6,appid:foot # Disable blur for selection tools windowrule=noblur:1,appid:slurp # Position windows relative to screen center windowrule=offsetx:20,offsety:-30,width:800,height:600,appid:alacritty # Send to specific tag and monitor windowrule=tags:9,monitor:HDMI-A-1,appid:discord # Terminal swallowing setup windowrule=isterm:1,appid:st windowrule=noswallow:1,appid:foot # Disable client-side decorations windowrule=allow_csd:1,appid:firefox # Unmanaged global window (desktop pets, camera) windowrule=isunglobal:1,appid:cheese # Named scratchpad toggle bind=alt,h,toggle_named_scratchpad,st-yazi,none,st -c st-yazi -e yazi ``` --- ## Tag Rules You can set all parameters in one line. If only `id` is set, the rule is followed when the id matches. If any of `monitor_name`, `monitor_make`, `monitor_model`, or `monitor_serial` are set, the rule is followed only if **all** of the set monitor fields match. > **Warning:** Layouts set in tag rules have a higher priority than monitor rule layouts. **Format:** ```ini tagrule=id:Values,Parameter:Values,Parameter:Values tagrule=id:Values,monitor_name:eDP-1,Parameter:Values,Parameter:Values tagrule=id:Values,monitor_make:xxx,monitor_model:xxx,Parameter:Values ``` > **Tip:** See [Layouts](/docs/window-management/layouts#supported-layouts) for detailed descriptions of each layout type. | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `id` | integer | 0-9 | Match by tag id, 0 means the ~0 tag | | `monitor_name` | string | monitor name | Match by monitor name | | `monitor_make` | string | monitor make | Match by monitor manufacturer | | `monitor_model` | string | monitor model | Match by monitor model | | `monitor_serial` | string | monitor serial | Match by monitor serial number | | `layout_name` | string | layout name | Layout name to set | | `no_render_border` | integer | `0` / `1` | Disable render border | | `no_hide` | integer | `0` / `1` | Not hide even if the tag is empty | | `nmaster` | integer | 0, 99 | Number of master windows | | `mfact` | float | 0.1–0.9 | Master area factor | ### Examples ```ini # Set layout for specific tags tagrule=id:1,layout_name:scroller tagrule=id:2,layout_name:scroller # Limit to specific monitor tagrule=id:1,monitor_name:eDP-1,layout_name:scroller tagrule=id:2,monitor_name:eDP-1,layout_name:scroller # Persistent tags (1-4) with layout assignment tagrule=id:1,no_hide:1,layout_name:scroller tagrule=id:2,no_hide:1,layout_name:scroller tagrule=id:3,monitor_name:eDP-1,no_hide:1,layout_name:scroller tagrule=id:4,monitor_name:eDP-1,no_hide:1,layout_name:scroller # Advanced tag configuration with master layout settings tagrule=id:5,layout_name:tile,nmaster:2,mfact:0.6 tagrule=id:6,monitor_name:HDMI-A-1,layout_name:monocle,no_render_border:1 ``` > **Tip:** For Waybar configuration with persistent tags, see [Status Bar](/docs/visuals/status-bar) documentation. --- ## Layer Rules You can set all parameters in one line. Target "layer shell" surfaces like status bars (`waybar`), launchers (`rofi`), or notification daemons. **Format:** ```ini layerrule=layer_name:Values,Parameter:Values,Parameter:Values ``` > **Tip:** You can use `mmsg -e` to get the last open layer name for debugging. | Parameter | Type | Values | Description | | :--- | :--- | :--- | :--- | | `layer_name` | string | layer name | Match name of layer, supports regex | | `animation_type_open` | string | slide, zoom, fade, none | Set open animation | | `animation_type_close` | string | slide, zoom, fade, none | Set close animation | | `noblur` | integer | `0` / `1` | Disable blur | | `noanim` | integer | `0` / `1` | Disable layer animation | | `noshadow` | integer | `0` / `1` | Disable layer shadow | > **Tip:** For animation types, see [Animations](/docs/visuals/animations#animation-types). For visual effects, see [Window Effects](/docs/visuals/effects). ### Examples ```ini # No blur or animation for slurp selection layer (avoids occlusion and ghosting in screenshots) layerrule=noanim:1,noblur:1,layer_name:selection # Zoom animation for Rofi with multiple parameters layerrule=animation_type_open:zoom,noanim:0,layer_name:rofi # Disable animations and shadows for notification daemon layerrule=noanim:1,noshadow:1,layer_name:swaync # Multiple effects for launcher layerrule=animation_type_open:slide,animation_type_close:fade,noblur:1,layer_name:wofi ```